gambas-source-code/app/examples/Database/PictureDatabase/.src/ModuleDatabase.module
2019-05-20 09:26:41 +03:00

215 lines
6.9 KiB
Text

' Gambas module file
'''
' Name: ModuleDatabase
' Author: Timothy Marshal-Nichols
' eMail: timothy.marshal-nichols@ntlworld.com
' Version: 1.0
' Version Date: April 2007
' Version History:
'
'''
' Licence Information
'
' This program is free software; you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation; either version 2 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with this program; if not, write to the Free Software
' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
'
' http://www.gnu.org/licenses/gpl.html
'
'''
' Description:
'
' Provides the interface to the pictures database.
'
'''
' Developed using Gambas2 Version
'
' Version: 1.9.48
'
' Gambas Components Used:
'
' gb - Gambas internal native classes
' gb.db - Database access
'
' Look in the Project menu then Properties... and select
' the Components tab. Check that the listed components
' are in the project.
'
'''
' External Dependencies:
'
' The required type of database must exist.
'
'''
' Class Usage:
'
' Open the pictures database. If the database or table does not
' exist then they are created.
'
' Use somthing like this for a SQLite3 database
'
' ModuleDatabase.OpenDatabase("sqlite3", User.Home, Application.Name, "", "")
'
' Use somthing like this for a MySQL database
'
' ModuleDatabase.OpenDatabase("mysql", "localhost", Application.Name, "mysql", "password")
'
' Use somthing like this for a PostgreSQL database
'
' ModuleDatabase.OpenDatabase("postgresql", "localhost", Application.Name, "timothy", "password")
'
' Call the Select() method to update items and then use ResultPictures to access the data.
'
' ModuleDatabase.Select()
' ModuleDatabase.ResultPictures.MoveTo(Row)
'
' You can then use the Add(), Update() and Delete() methods to change the database.
'
' ModuleDatabase.Add(Path)
' ModuleDatabase.Update(Row, NewDescription)
' ModuleDatabase.Delete(Row)
'
' Call the CloseDatabase method before you quit your application
'
' ModuleDatabase.CloseDatabase()
'
'''
Public Const ThumbSize As Integer = 36
Public ResultPictures As Result
Private databaseConnection As New Connection
Private tempFile As String
Public Sub _init()
tempFile = Temp() & ".png"
End
' Opens the pictures database. If the database or table does not
' exist then they are created.
Public Sub OpenDatabase(DBType As String, DBHost As String, DBName As String, UserName As String, UserPassword As String)
Dim pictureTable As Table
Dim errorMessageHeader As String
' If you wnat to see the commands sent to the
' database then uncommant this line
' DB.Debug = TRUE
' DBName = Lower(DBName)
' Open a connection (to the database server only)
databaseConnection.Type = Lower(DBType)
databaseConnection.Host = DBHost
databaseConnection.Name = ""
databaseConnection.Login = UserName
databaseConnection.Password = UserPassword
databaseConnection.Port = ""
' Open the connection
Try databaseConnection.Open()
If Error Then
errorMessageHeader = ("Could not open database connection") & " " & DBHost
Error.Raise(Error.Text)
End If
' Check if the server connection has a database with the
' required database name.
If Not databaseConnection.Databases.Exist(DBName) Then
Print ("Database not found. Creating new database")
' Create a new database
databaseConnection.Databases.Add(DBName)
' I found I needed this with a SQLite database
' (but not with a MySQL database)
Wait 0.5
End If
' Close the server connection
databaseConnection.Close()
' Open a connection to the database
databaseConnection.Host = DBHost
databaseConnection.Name = DBName
Try databaseConnection.Open()
If Error Then
errorMessageHeader = ("Could not open database") & " " & DBName & " on " & DBHost
Error.Raise(Error.Text)
End If
' Check if the database has a pictures table
If Not databaseConnection.Tables.Exist("pictures") Then
Print ("Database tables not found. Creating new pictures table")
' Add a picture table to the database
pictureTable = databaseConnection.Tables.Add("pictures")
pictureTable.Fields.Add("id", db.Serial) ' id field as autoinc integer
pictureTable.Fields.Add("thumb", db.Blob) ' thumb field as blob
pictureTable.Fields.Add("image", db.Blob) ' ' image field as blob
pictureTable.Fields.Add("description", db.String, 0) ' description field as unlimited string
pictureTable.PrimaryKey = ["id"]
pictureTable.Update()
End If
Catch
If errorMessageHeader = "" Then
errorMessageHeader = ("Database connection error:") & " " & DBName & " on " & DBHost
End If
Error.Raise("<b>" & errorMessageHeader & "</b><hr>" & ("Error:") & "<br>" & DConv(Error.Text))
End
Public Sub Add(ImagePath As String)
Dim img As Image
Dim newPicture As Result
'Dim pictureData As String
Dim scale As Float
Dim eTime As Float
newPicture = databaseConnection.Create("pictures")
' Save temp image as png file
img = Image.Load(ImagePath)
img.Save(tempFile)
newPicture["image"] = File.Load(tempFile)
' Create image thumb
If img.Width > thumbSize Or img.Height > thumbSize Then
' Calc factor to scale isotropic
scale = Min(ThumbSize / img.Width, ThumbSize / img.Height)
img = img.Stretch(img.Width * scale, img.Height * scale)
img.Save(tempFile)
End If
newPicture["thumb"] = File.Load(tempFile)
' Add description and update
newPicture["description"] = ("Image") & " " & File.BaseName(ImagePath) & " " & ("added:") & " " & Format(Now, "dddd, dd mmmm yyyy hh:nn:ss")
eTime = Timer
newPicture.Update()
Print ("Done in") & " "; Format(Timer - eTime, "#.###"); " " & ("s")
If Exist(tempFile) Then Kill tempFile
Catch
Error.Raise(("<b>Add database record error</b><hr>Error:<br>") & DConv(Error.Text))
End
Public Sub Select()
ResultPictures = databaseConnection.Edit("pictures")
Catch
Error.Raise(("<b>Select database records error</b><hr>Error:<br>") & DConv(Error.Text))
End
Public Sub Update(Row As Integer, Description As String)
ResultPictures.MoveTo(Row)
ResultPictures["description"] = Conv(Description, Desktop.Charset, databaseConnection.Charset)
ResultPictures.Update()
Catch
Error.Raise(("<b>Update database record error</b><hr>Error:<br>") & DConv(Error.Text))
End
Public Sub Delete(Row As Integer)
ResultPictures.MoveTo(Row)
ResultPictures.Delete()
Catch
Error.Raise(("<b>Delete database record error</b><hr>Error:<br>") & DConv(Error.Text))
End
Public Sub CloseDatabase()
Try databaseConnection.Close()
If Error Then Print ("Error closing database")
End
''' End of ModuleDatabase '''