Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/PivotGridDemo.Wpf/Helpers/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/PivotGridDemo.Wpf/Helpers/DatabaseHelper.vb

Imports Microsoft.VisualBasic
Imports DevExpress.Xpo
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.IO
Imports System.Text
Imports System.Xml
Imports DevExpress.Xpf.Core
Imports System.Windows
Imports System.Windows.Input

Namespace PivotGridDemo.PivotGrid.Helpers
	Public Delegate Sub UpdateProgressCallback(ByVal percents As Integer)
	Public Delegate Sub DatabaseGeneratedCallback()
	Public Delegate Sub DataSetFilledCallback(ByVal dataSet As DataSet)

	Public NotInheritable Class DatabaseHelper
		Private ReadOnly Shared random As New Random()
		Private ReadOnly Shared worker As New BackgroundWorker()
		Private Shared ReadOnly Names() As String = { "Julia", "Stephanie", "Alex", "John", "Curtis", "Keith", "Timothy", "Jack", "Miranda", "Alice" }
		Private Shared ReadOnly LastNames() As String = { "Black", "White", "Brown", "Smith", "Cooper", "Parker", "Walker", "Hunter", "Burton", "Douglas", "Fox", "Simpson" }
		Private Shared ReadOnly Adjectives() As String = { "Ancient", "Modern", "Mysterious", "Elegant", "Red", "Green", "Blue", "Amazing", "Wonderful", "Astonishing", "Lovely", "Beautiful", "Inexpensive", "Famous", "Magnificent", "Fancy" }
		Private Shared ReadOnly ProductNames() As String = { "Ice Cubes", "Bicycle", "Desk", "Hamburger", "Notebook", "Tea", "Cellphone", "Butter", "Frying Pan", "Napkin", "Armchair", "Chocolate", "Yoghurt", "Statuette", "Keychain" }
		Private Shared ReadOnly CategoryNames() As String = { "Business", "Presents", "Accessories", "Home", "Hobby" }

		Private Sub New()
		End Sub
		Shared Sub New()
			AddHandler worker.DoWork, AddressOf GenerateDatabaseAsyncCore
			worker.WorkerReportsProgress = True
			worker.WorkerSupportsCancellation = True
		End Sub
		Public Shared ReadOnly Property IsGenerating() As Boolean
			Get
				Return worker.IsBusy
			End Get
		End Property
		Public Shared Sub GenerateDatabaseAsync(ByVal rowsCount As Integer, ByVal updateProgressCallback As UpdateProgressCallback, ByVal databaseGeneratedCallback As DatabaseGeneratedCallback)
			AddHandler worker.ProgressChanged, Function(sender, e) AnonymousMethod1(sender, e, updateProgressCallback)
			AddHandler worker.RunWorkerCompleted, Function(sender, e) AnonymousMethod2(sender, e, databaseGeneratedCallback)
			worker.RunWorkerAsync(rowsCount)
		End Sub
		
		Private Shared Function AnonymousMethod1(ByVal sender As Object, ByVal e As ProgressChangedEventArgs, ByVal updateProgressCallback As UpdateProgressCallback) As Boolean
			updateProgressCallback(e.ProgressPercentage)
			Return True
		End Function
		
		Private Shared Function AnonymousMethod2(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs, ByVal databaseGeneratedCallback As DatabaseGeneratedCallback) As Boolean
			databaseGeneratedCallback()
			Return True
		End Function
		Public Shared Sub CancelDatabaseGenerationAsync()
			worker.CancelAsync()
		End Sub
		Private Shared Sub GenerateDatabaseAsyncCore(ByVal sender As Object, ByVal e As DoWorkEventArgs)
			worker.ReportProgress(0)
			Dim rowsCount As Integer = CInt(Fix(e.Argument))
			Dim rowsRemaining As Integer = rowsCount
			Using uow As New UnitOfWork()
				Try
					uow.ClearDatabase()
				Catch
				End Try
				Dim salesPersonCount As Integer = random.Next(10, 15)
				Dim customersCount As Integer = random.Next(30, 50)
				Dim productsCount As Integer = random.Next(80, 100)
				Dim peopleNames As List(Of String) = GeneratePeopleNames(salesPersonCount + customersCount)
				Dim productNames As List(Of String) = GenerateProductNames(productsCount)
				Dim indexPersonName As Integer = 0

				Dim salesPeople As New XPCollection(Of SalesPerson)(uow)
				For i As Integer = 0 To salesPersonCount - 1
					salesPeople.Add(New SalesPerson(uow, peopleNames(indexPersonName)))
					indexPersonName += 1
				Next i

				Dim customers As New XPCollection(Of Customer)(uow)
				For i As Integer = 0 To customersCount - 1
					customers.Add(New Customer(uow, peopleNames(indexPersonName)))
					indexPersonName += 1
				Next i

				Dim categories As New XPCollection(Of Category)(uow)
				For i As Integer = 0 To CategoryNames.Length - 1
					categories.Add(New Category(uow, CategoryNames(i)))
				Next i

				Dim products As New XPCollection(Of Product)(uow)
				For i As Integer = 0 To productsCount - 1
					products.Add(New Product(uow, productNames(i), categories(random.Next(categories.Count)), random.Next(500)))
				Next i

				Do
					Dim order As New Order(uow, salesPeople(random.Next(salesPeople.Count)), customers(random.Next(customers.Count)), GetDate())
					Dim salesCount As Integer = If(rowsRemaining >= 5, random.Next(1, 6), rowsRemaining)
					For j As Integer = 0 To salesCount - 1
						Dim product As Product = products(random.Next(products.Count))
						Dim TempSale As Sale = New Sale(uow, order, product, random.Next(1, 100), GetProductPrice(product))
						rowsRemaining -= 1
					Next j
					uow.CommitChanges()
					worker.ReportProgress(rowsCount - rowsRemaining)
				Loop While (Not worker.CancellationPending) AndAlso rowsRemaining > 0
				uow.FlushChanges()
			End Using
		End Sub
		Private Shared Function GeneratePeopleNames(ByVal count As Integer) As List(Of String)
			Dim names As New List(Of String)(count)
			Do While names.Count < count
				Dim name As String = GenerateName()
				If (Not names.Contains(name)) Then
					names.Add(name)
				End If
			Loop
			Return names
		End Function
		Private Shared Function GenerateProductNames(ByVal count As Integer) As List(Of String)
			Dim names As New List(Of String)(count)
			Do While names.Count < count
				Dim name As String = GenerateProductName()
				If (Not names.Contains(name)) Then
					names.Add(name)
				End If
			Loop
			Return names
		End Function
		Private Shared Function GenerateName() As String
			Return String.Format("{0} {1}", Names(random.Next(Names.Length)), LastNames(random.Next(LastNames.Length)))
		End Function
		Private Shared Function GenerateProductName() As String
			Return String.Format("{0} {1}", Adjectives(random.Next(Adjectives.Length)), ProductNames(random.Next(ProductNames.Length)))
		End Function
		Private Shared Function GetProductPrice(ByVal product As Product) As Decimal
			Return product.Price * CDec(0.5 + random.NextDouble())
		End Function
		Private Shared Function GetDate() As DateTime
			Return New DateTime(random.Next(2008, 2011), random.Next(1, 13), random.Next(1, 28))
		End Function
		Public Shared Sub GetDataSetAsync(ByVal callback As DataSetFilledCallback)
			Dim workerDataSetFiller As New BackgroundWorker()
			AddHandler workerDataSetFiller.DoWork, AddressOf GetDataSetAsyncCore
			AddHandler workerDataSetFiller.RunWorkerCompleted, Function(s, e) AnonymousMethod3(s, e, callback)
			workerDataSetFiller.RunWorkerAsync()
			workerDataSetFiller.Dispose()
		End Sub
		
		Private Shared Function AnonymousMethod3(ByVal s As Object, ByVal e As RunWorkerCompletedEventArgs, ByVal callback As DataSetFilledCallback) As Boolean
			callback(If(e.Error Is Nothing, CType(e.Result, DataSet), Nothing))
			Return True
		End Function
		Private Shared Sub GetDataSetAsyncCore(ByVal sender As Object, ByVal e As DoWorkEventArgs)
			Dim connection As New OleDbConnection("Provider=SQLOLEDB;" & ServerParameters.GetDBConnectionString())
			Dim adapter As New OleDbDataAdapter("select Orders.OID as OrderID, SalesPersonName, CustomerName, CategoryName, ProductName, Quantity, UnitPrice, OrderDate " & "from orders " & "join Sales on Sales.[Order] = Orders.OID " & "join SalesPeople on Orders.SalesPerson = SalesPeople.OID " & "join Customers on Orders.Customer = Customers.OID " & "join Products on Sales.Product = Products.OID " & "join Categories on Products.Category = Categories.OID", connection)
			Dim dataSet As New DataSet()
			Try
				adapter.Fill(dataSet, "orders")
				e.Result = dataSet
			Catch e1 As OleDbException
				e.Result = Nothing
			Finally
				connection.Dispose()
			End Try
		End Sub
		Public Shared Function CalculateRecordCount() As Integer
			Try
				Using connection As New SqlConnection(ServerParameters.GetServerConnectionString())
					connection.Open()
					Using command As New SqlCommand(String.Format("select count(OID) as count from [{0}].[dbo].[Sales]", ServerParameters.DBName), connection)
						Using reader As SqlDataReader = command.ExecuteReader()
							reader.Read()
							Return CInt(Fix(reader("count")))
						End Using
					End Using
				End Using
			Catch
				Return -1
			End Try
		End Function
		Public Shared Sub TestConfiguration()
			ServerParameters.IsParametersCorrect()
		End Sub
	End Class

	Public Class ServerParameters
		#Region "Singleton"
		Public Sub New()
		End Sub
		Private Shared fInstance As ServerParameters
		Shared ReadOnly Property Instance() As ServerParameters
			Get
				If fInstance Is Nothing Then
					fInstance = New ServerParameters()
				End If
				Return fInstance
			End Get
		End Property
		#End Region
		Private Const ServerParametersFileName As String = "PivotGridSQLParameters.xml"
		Private fServer As String = "(local)"
		Private fLogin As String = "sa"
		Private fPassword As String = String.Empty
		Private fUseWindowsAuthentication As Boolean = True

		Public Shared ReadOnly Property DBName() As String
			Get
				Return "PivotGridDemoDB"
			End Get
		End Property
		Public Shared Property Server() As String
			Get
				Return Instance.fServer
			End Get
			Set(ByVal value As String)
				Instance.fServer = value
			End Set
		End Property
		Public Shared Property Login() As String
			Get
				Return Instance.fLogin
			End Get
			Set(ByVal value As String)
				Instance.fLogin = value
			End Set
		End Property
		Public Shared Property Password() As String
			Get
				Return Instance.fPassword
			End Get
			Set(ByVal value As String)
				Instance.fPassword = value
			End Set
		End Property
		Public Shared Property UseWindowsAuthentication() As Boolean
			Get
				Return Instance.fUseWindowsAuthentication
			End Get
			Set(ByVal value As Boolean)
				Instance.fUseWindowsAuthentication = value
			End Set
		End Property
		Public Shared Sub LoadParameters()
			If (Not File.Exists(ServerParametersFileName)) Then
				Return
			End If
			Dim doc As New XmlDocument()
			Try
				doc.Load(ServerParametersFileName)
				If doc.DocumentElement.Name = "Parameters" Then
					Dim parameters() As String = doc.DocumentElement.InnerText.Split(New Char() { ";"c })
					Server = parameters(0)
					UseWindowsAuthentication = Convert.ToBoolean(parameters(1))
					Login = parameters(2)
				End If
			Catch
			End Try
		End Sub
		Public Shared Sub SaveParameters()
			Try
				Using writer As New XmlTextWriter(ServerParametersFileName, Encoding.UTF8)
					writer.WriteElementString("Parameters", String.Format("{0};{1};{2}", Server, UseWindowsAuthentication, Login))
				End Using
			Catch
			End Try
		End Sub
		Public Shared Function GetServerConnectionString() As String
			If UseWindowsAuthentication Then
				Return String.Format("data source={0};integrated security=SSPI;connection timeout=3", Server)
			Else
				Return String.Format("data source={0};user id={1};password={2};connection timeout=3", Server, Login, Password)
			End If
		End Function
		Public Shared Function GetDBConnectionString() As String
			Return String.Format("{0};initial catalog={1}", GetServerConnectionString(), DBName)
		End Function
		Public Shared Function IsParametersCorrect() As Boolean
			Mouse.OverrideCursor = Cursors.Wait
			Using connection As New SqlConnection(GetServerConnectionString())
				Try
					connection.Open()
					connection.Close()
				Catch
					DXMessageBox.Show("Failed to connect to the server.", "Connection Error", MessageBoxButton.OK, MessageBoxImage.Error)
					Return False
				Finally
					Mouse.OverrideCursor = Nothing
				End Try
			End Using
			Return True
		End Function
	End Class

	#Region "XPOs"
	<Persistent("SalesPeople")> _
	Public Class SalesPerson
		Inherits XPObject
		Private name_Renamed As String

		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal name As String)
			Me.New(session)
			Me.Name = name
		End Sub
		<Persistent("SalesPersonName")> _
		Public Property Name() As String
			Get
				Return name_Renamed
			End Get
			Set(ByVal value As String)
				SetPropertyValue("Name", name_Renamed, value)
			End Set
		End Property
		<Association("SalesPeople-Orders")> _
		Public ReadOnly Property Orders() As XPCollection(Of Order)
			Get
				Return GetCollection(Of Order)("Orders")
			End Get
		End Property
	End Class

	<Persistent("Customers")> _
	Public Class Customer
		Inherits XPObject
		Private name_Renamed As String

		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal name As String)
			Me.New(session)
			Me.Name = name
		End Sub
		<Persistent("CustomerName")> _
		Public Property Name() As String
			Get
				Return name_Renamed
			End Get
			Set(ByVal value As String)
				SetPropertyValue("Name", name_Renamed, value)
			End Set
		End Property
		<Association("Customers-Orders")> _
		Public ReadOnly Property Orders() As XPCollection(Of Order)
			Get
				Return GetCollection(Of Order)("Orders")
			End Get
		End Property
	End Class

	<Persistent("Orders")> _
	Public Class Order
		Inherits XPObject
		Private salesPerson_Renamed As SalesPerson
		Private customer_Renamed As Customer
		Private date_Renamed As DateTime

		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal salesPerson As SalesPerson, ByVal customer As Customer, ByVal [date] As DateTime)
			Me.New(session)
			SalesPerson = salesPerson
			Customer = customer
			Me.Date = [date]
			salesPerson.Orders.Add(Me)
			customer.Orders.Add(Me)
		End Sub
		<Association("SalesPeople-Orders")> _
		Public Property SalesPerson() As SalesPerson
			Get
				Return salesPerson_Renamed
			End Get
			Set(ByVal value As SalesPerson)
				SetPropertyValue("SalesPerson", salesPerson_Renamed, value)
			End Set
		End Property
		<Association("Customers-Orders")> _
		Public Property Customer() As Customer
			Get
				Return customer_Renamed
			End Get
			Set(ByVal value As Customer)
				SetPropertyValue("Customer", customer_Renamed, value)
			End Set
		End Property
		<Association("Orders-Sales")> _
		Public ReadOnly Property Sales() As XPCollection(Of Sale)
			Get
				Return GetCollection(Of Sale)("Sales")
			End Get
		End Property
		<Persistent("OrderDate")> _
		Public Property [Date]() As DateTime
			Get
				Return date_Renamed
			End Get
			Set(ByVal value As DateTime)
				SetPropertyValue("Date", date_Renamed, value)
			End Set
		End Property
	End Class

	<Persistent("Categories")> _
	Public Class Category
		Inherits XPObject
		Private name_Renamed As String
		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal name As String)
			Me.New(session)
			Me.Name = name
		End Sub
		<Persistent("CategoryName")> _
		Public Property Name() As String
			Get
				Return name_Renamed
			End Get
			Set(ByVal value As String)
				SetPropertyValue("Name", name_Renamed, value)
			End Set
		End Property
		<Association("Category-Products")> _
		Public ReadOnly Property Products() As XPCollection(Of Product)
			Get
				Return GetCollection(Of Product)("Products")
			End Get
		End Property
	End Class

	<Persistent("Products")> _
	Public Class Product
		Inherits XPObject
		Private name_Renamed As String
		Private category_Renamed As Category
		Private price_Renamed As Decimal

		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal name As String, ByVal category As Category, ByVal price As Decimal)
			Me.New(session)
			Me.Name = name
			Category = category
			Category.Products.Add(Me)
			Me.Price = price
		End Sub
		<Persistent("ProductName")> _
		Public Property Name() As String
			Get
				Return name_Renamed
			End Get
			Set(ByVal value As String)
				SetPropertyValue("Name", name_Renamed, value)
			End Set
		End Property
		<Association("Category-Products")> _
		Public Property Category() As Category
			Get
				Return category_Renamed
			End Get
			Set(ByVal value As Category)
				SetPropertyValue("Category", category_Renamed, value)
			End Set
		End Property
		<Association("Product-Sales")> _
		Public ReadOnly Property Sales() As XPCollection(Of Sale)
			Get
				Return GetCollection(Of Sale)("Sales")
			End Get
		End Property
		<NonPersistent> _
		Public Property Price() As Decimal
			Get
				Return price_Renamed
			End Get
			Set(ByVal value As Decimal)
				price_Renamed = value
			End Set
		End Property
	End Class

	<Persistent("Sales")> _
	Public Class Sale
		Inherits XPObject
		Private order_Renamed As Order
		Private product_Renamed As Product
		Private quantity_Renamed As Integer
		Private unitPrice_Renamed As Decimal

		Public Sub New(ByVal session As Session)
			MyBase.New(session)
		End Sub
		Public Sub New(ByVal session As Session, ByVal order As Order, ByVal product As Product, ByVal quantity As Integer, ByVal unitPrice As Decimal)
			Me.New(session)
			Order = order
			Product = product
			Me.Quantity = quantity
			Me.UnitPrice = unitPrice
			order.Sales.Add(Me)
			product.Sales.Add(Me)
		End Sub
		<Association("Orders-Sales")> _
		Public Property Order() As Order
			Get
				Return order_Renamed
			End Get
			Set(ByVal value As Order)
				SetPropertyValue("Order", order_Renamed, value)
			End Set
		End Property
		<Association("Product-Sales")> _
		Public Property Product() As Product
			Get
				Return product_Renamed
			End Get
			Set(ByVal value As Product)
				SetPropertyValue("Product", product_Renamed, value)
			End Set
		End Property
		<Persistent("Quantity")> _
		Public Property Quantity() As Integer
			Get
				Return quantity_Renamed
			End Get
			Set(ByVal value As Integer)
				SetPropertyValue("Quantity", quantity_Renamed, value)
			End Set
		End Property
		<Persistent("UnitPrice")> _
		Public Property UnitPrice() As Decimal
			Get
				Return unitPrice_Renamed
			End Get
			Set(ByVal value As Decimal)
				SetPropertyValue("UnitPrice", unitPrice_Renamed, value)
			End Set
		End Property
	End Class
	#End Region
End Namespace