Mini Kabibi Habibi
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