[Libreoffice-commits] core.git: wizards/source
Jean-Pierre Ledure (via logerrit)
logerrit at kemper.freedesktop.org
Thu Nov 5 15:17:30 UTC 2020
wizards/source/sfdatabases/SF_Database.xba | 842 +++++++++++++++++++++++++++++
wizards/source/sfdatabases/SF_Register.xba | 195 ++++++
wizards/source/sfdatabases/__License.xba | 26
wizards/source/sfdatabases/dialog.xlb | 3
wizards/source/sfdatabases/script.xlb | 7
5 files changed, 1073 insertions(+)
New commits:
commit 584e32d7c776e562447697e07592bb992700f313
Author: Jean-Pierre Ledure <jp at ledure.be>
AuthorDate: Thu Nov 5 16:14:30 2020 +0100
Commit: Jean-Pierre Ledure <jp at ledure.be>
CommitDate: Thu Nov 5 16:14:30 2020 +0100
ScriptForge - SFDatabases library
Additional "LibreOffice Macros & Dialogs" library
Change-Id: I4424e37b4d2b8bc68cf2eeb49c767de2ca60030d
diff --git a/wizards/source/sfdatabases/SF_Database.xba b/wizards/source/sfdatabases/SF_Database.xba
new file mode 100644
index 000000000000..ec20d6118326
--- /dev/null
+++ b/wizards/source/sfdatabases/SF_Database.xba
@@ -0,0 +1,842 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
+<script:module xmlns:script="http://openoffice.org/2000/script" script:name="SF_Database" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
+REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. ===
+REM === The SFDatabases library is one of the associated libraries. ===
+REM === Full documentation is available on https://help.libreoffice.org/ ===
+REM =======================================================================================================================
+
+Option Compatible
+Option ClassModule
+
+Option Explicit
+
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+''' SF_Database
+''' =========
+''' Management of databases embedded in or related to Base documents
+''' Each instance of the current class represents a single database, with essentially its tables, queries and data
+'''
+''' The exchanges with the database are done in SQL only.
+''' To make them more readable, use optionally square brackets to surround table/query/field names
+''' instead of the (RDBMS-dependent) normal surrounding character (usually, double-quote, single-quote or other).
+''' SQL statements may be run in direct or indirect mode. In direct mode the statement is transferred literally
+''' without syntax checking nor review to the database system.
+'''
+''' The provided interfaces include simple tables, queries and fields lists, and access to database metadata.
+'''
+''' Service invocation and usage:
+''' 1) To access any database at anytime
+''' Dim myDatabase As Object
+''' Set myDatabase = CreateScriptService("SFDatabases.Database", FileName, , [ReadOnly], [User, [Password]])
+''' ' Args:
+''' ' FileName: the name of the Base file compliant with the SF_FileSystem.FileNaming notation
+''' ' RegistrationName: the name of a registered database (mutually exclusive with FileName)
+''' ' ReadOnly: Default = True
+''' ' User, Password: additional connection arguments to the database server
+''' ' ... Run queries, SQL statements, ...
+''' myDatabase.CloseDatabase()
+'''
+''' 2) To access the database related to the current Base document
+''' Dim myDoc As Object, myDatabase As Object, ui As Object
+''' Set ui = CreateScriptService("UI")
+''' Set myDoc = ui.OpenBaseDocument("myDb.odb")
+''' Set myDatabase = myDoc.GetDatabase() ' user and password are supplied here, if needed
+''' ' ... Run queries, SQL statements, ...
+''' myDoc.CloseDocument()
+'''
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+REM ================================================================== EXCEPTIONS
+
+Private Const DBREADONLYERROR = "DBREADONLYERROR"
+Private Const SQLSYNTAXERROR = "SQLSYNTAXERROR"
+
+REM ============================================================= PRIVATE MEMBERS
+
+Private [Me] As Object
+Private [_Parent] As Object
+Private ObjectType As String ' Must be DATABASE
+Private ServiceName As String
+Private _DataSource As Object ' com.sun.star.comp.dba.ODatabaseSource
+Private _Connection As Object ' com.sun.star.sdbc.XConnection
+Private _URL As String ' Text on status bar
+Private _Location As String ' File name
+Private _ReadOnly As Boolean
+Private _MetaData As Object ' com.sun.star.sdbc.XDatabaseMetaData
+
+REM ============================================================ MODULE CONSTANTS
+
+REM ===================================================== CONSTRUCTOR/DESCTRUCTOR
+
+REM -----------------------------------------------------------------------------
+Private Sub Class_Initialize()
+ Set [Me] = Nothing
+ Set [_Parent] = Nothing
+ ObjectType = "DATABASE"
+ ServiceName = "SFDatabases.Database"
+ Set _DataSource = Nothing
+ Set _Connection = Nothing
+ _URL = ""
+ _Location = ""
+ _ReadOnly = True
+ Set _MetaData = Nothing
+End Sub ' SFDatabases.SF_Database Constructor
+
+REM -----------------------------------------------------------------------------
+Private Sub Class_Terminate()
+ Call Class_Initialize()
+End Sub ' SFDatabases.SF_Database Destructor
+
+REM -----------------------------------------------------------------------------
+Public Function Dispose() As Variant
+ Call Class_Terminate()
+ Set Dispose = Nothing
+End Function ' SFDatabases.SF_Database Explicit Destructor
+
+REM ================================================================== PROPERTIES
+
+REM -----------------------------------------------------------------------------
+Property Get Queries() As Variant
+''' Return the list of available queries in the database
+ Queries = _PropertyGet("Queries")
+End Property ' SFDatabases.SF_Database.Queries (get)
+
+REM -----------------------------------------------------------------------------
+Property Get Tables() As Variant
+''' Return the list of available Tables in the database
+ Tables = _PropertyGet("Tables")
+End Property ' SFDatabases.SF_Database.Tables (get)
+
+REM -----------------------------------------------------------------------------
+Property Get XConnection() As Variant
+''' Return a com.sun.star.sdbc.XConnection UNO object
+ XConnection = _PropertyGet("XConnection")
+End Property ' SFDatabases.SF_Database.XConnection (get)
+
+REM -----------------------------------------------------------------------------
+Property Get XMetaData() As Variant
+''' Return a com.sun.star.sdbc.XDatabaseMetaData UNO object
+ XMetaData = _PropertyGet("XMetaData")
+End Property ' SFDatabases.SF_Database.XMetaData (get)
+
+REM ===================================================================== METHODS
+
+REM -----------------------------------------------------------------------------
+Public Sub CloseDatabase()
+''' Close the current database connection
+
+Const cstThisSub = "SFDatabases.Database.CloseDatabase"
+Const cstSubArgs = ""
+
+ On Local Error GoTo 0 ' Disable useless error checking
+
+Check:
+ ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
+
+Try:
+ With _Connection
+ If Not IsNull(_Connection) Then
+ If ScriptForge.SF_Session.HasUnoMethod(_Connection, "flush") Then .flush()
+ .close()
+ .dispose()
+ End If
+ Dispose()
+ End With
+
+Finally:
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Sub
+End Sub
+
+REM -----------------------------------------------------------------------------
+Public Function DAvg(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ ) As Variant
+''' Compute the aggregate function AVG() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+
+ DAvg = _DFunction("Avg", Expression, TableName, Criteria)
+
+End Function ' SFDatabases.SF_Database.DAvg
+
+REM -----------------------------------------------------------------------------
+Public Function DCount(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ ) As Variant
+''' Compute the aggregate function COUNT() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+
+ DCount = _DFunction("Count", Expression, TableName, Criteria)
+
+End Function ' SFDatabases.SF_Database.DCount
+
+REM -----------------------------------------------------------------------------
+Public Function DLookup(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ , Optional ByVal OrderClause As Variant _
+ ) As Variant
+''' Compute the aggregate function Lookup() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' To order the results, a pvOrderClause may be precised. The 1st record will be retained.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+''' pvOrderClause: an optional order clause incl. "DESC" if relevant
+
+ DLookup = _DFunction("Lookup", Expression, TableName, Criteria, OrderClause)
+
+End Function ' SFDatabases.SF_Database.DLookup
+
+REM -----------------------------------------------------------------------------
+Public Function DMax(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ ) As Variant
+''' Compute the aggregate function MAX() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+
+ DMax = _DFunction("Max", Expression, TableName, Criteria)
+
+End Function ' SFDatabases.SF_Database.DMax
+
+REM -----------------------------------------------------------------------------
+Public Function DMin(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ ) As Variant
+''' Compute the aggregate function MIN() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+
+ DMin = _DFunction("Min", Expression, TableName, Criteria)
+
+End Function ' SFDatabases.SF_Database.DMin
+
+REM -----------------------------------------------------------------------------
+Public Function DSum(Optional ByVal Expression As Variant _
+ , Optional ByVal TableName As Variant _
+ , Optional ByVal Criteria As Variant _
+ ) As Variant
+''' Compute the aggregate function Sum() on a field or expression belonging to a table
+''' filtered by a WHERE-clause.
+''' Args:
+''' Expression: an SQL expression
+''' TableName: the name of a table
+''' Criteria: an optional WHERE clause without the word WHERE
+
+ DSum = _DFunction("Sum", Expression, TableName, Criteria)
+
+End Function ' SFDatabases.SF_Database.DSum
+
+REM -----------------------------------------------------------------------------
+Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
+''' Return the actual value of the given property
+''' Args:
+''' PropertyName: the name of the property as a string
+''' Returns:
+''' The actual value of the property
+''' Exceptions:
+''' ARGUMENTERROR The property does not exist
+''' Examples:
+''' myDatabase.GetProperty("Queries")
+
+Const cstThisSub = "SFDatabases.Database.GetProperty"
+Const cstSubArgs = ""
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ GetProperty = Null
+
+Check:
+ If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not ScriptForge.SF_Utils._Validate(PropertyName, "PropertyName", V_STRING, Properties()) Then GoTo Catch
+ End If
+
+Try:
+ GetProperty = _PropertyGet(PropertyName)
+
+Finally:
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database.GetProperty
+
+REM -----------------------------------------------------------------------------
+Public Function GetRows(Optional ByVal SQLCommand As Variant _
+ , Optional ByVal DirectSQL As Variant _
+ , Optional ByVal Header As Variant _
+ , Optional ByVal MaxRows As Variant _
+ ) As Variant
+''' Return the content of a table, a query or a SELECT SQL statement as an array
+''' Args:
+''' SQLCommand: a table name, a query name or a SELECT SQL statement
+''' DirectSQL: when True, no syntax conversion is done by LO. Default = False
+''' Ignored when SQLCommand is a table or a query name
+''' Header: When True, a header row is inserted on the top of the array with the column names. Default = False
+''' MaxRows: The maximum number of returned rows. If absent, all records are returned
+''' Returns:
+''' a 2D array(row, column), even if only 1 column and/or 1 record
+''' an empty array if no records returned
+''' Example:
+''' Dim a As Variant
+''' a = myDatabase.GetRows("SELECT [First Name], [Last Name] FROM [Employees] ORDER BY [Last Name]", Header := True)
+
+Dim vResult As Variant ' Return value
+Dim oResult As Object ' com.sun.star.sdbc.XResultSet
+Dim oQuery As Object ' com.sun.star.ucb.XContent
+Dim sSql As String ' SQL statement
+Dim bDirect ' Alias of DirectSQL
+Dim lCols As Long ' Number of columns
+Dim lRows As Long ' Number of rows
+Dim oColumns As Object
+Dim i As Long
+Const cstThisSub = "SFDatabases.Database.GetRows"
+Const cstSubArgs = "SQLCommand, [DirectSQL=False], [Header=False], [MaxRows=0]"
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ vResult = Array()
+
+Check:
+ If IsMissing(DirectSQL) Or IsEmpty(DirectSQL) Then DirectSQL = False
+ If IsMissing(Header) Or IsEmpty(Header) Then Header = False
+ If IsMissing(MaxRows) Or IsEmpty(MaxRows) Then MaxRows = 0
+ If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not ScriptForge.SF_Utils._Validate(SQLCommand, "SQLCommand", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(DirectSQL, "DirectSQL", ScriptForge.V_BOOLEAN) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(Header, "Header", ScriptForge.V_BOOLEAN) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(MaxRows, "MaxRows", ScriptForge.V_NUMERIC) Then GoTo Finally
+ End If
+
+Try:
+ ' Table, query of SQL ? Prepare resultset
+ If ScriptForge.SF_Array.Contains(Tables, SQLCommand, CaseSensitive := True, SortOrder := "ASC") Then
+ sSql = "SELECT * FROM [" & SQLCommand & "]"
+ bDirect = True
+ ElseIf ScriptForge.SF_Array.Contains(Queries, SQLCommand, CaseSensitive := True, SortOrder := "ASC") Then
+ Set oQuery = _Connection.Queries.getByName(SQLCommand)
+ sSql = oQuery.Command
+ bDirect = Not oQuery.EscapeProcessing
+ ElseIf ScriptForge.SF_String.StartsWith(SQLCommand, "SELECT", CaseSensitive := False) Then
+ sSql = SQLCommand
+ bDirect = DirectSQL
+ Else
+ GoTo Finally
+ End If
+
+ ' Execute command
+ Set oResult = _ExecuteSql(sSql, bDirect)
+ If IsNull(oResult) Then GoTo Finally
+
+ With oResult
+ 'Initialize output array with header row
+ Set oColumns = oResult.getColumns()
+ lCols = oColumns.Count - 1
+ If Header Then
+ lRows = 0
+ ReDim vResult(0 To lRows, 0 To lCols)
+ For i = 0 To lCols
+ vResult(lRows, i) = oColumns.getByIndex(i).Name
+ Next i
+ If MaxRows > 0 Then MaxRows = MaxRows + 1
+ Else
+ lRows = -1
+ End If
+
+ ' Load data
+ .first()
+ Do While Not .isAfterLast() And (MaxRows = 0 Or lRows < MaxRows - 1)
+ lRows = lRows + 1
+ If lRows = 0 Then
+ ReDim vResult(0 To lRows, 0 To lCols)
+ Else
+ ReDim Preserve vResult(0 To lRows, 0 To lCols)
+ End If
+ For i = 0 To lCols
+ vResult(lRows, i) = _GetColumnValue(oResult, i + 1)
+ Next i
+ .next()
+ Loop
+ End With
+
+Finally:
+ GetRows = vResult
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database.GetRows
+
+REM -----------------------------------------------------------------------------
+Public Function Methods() As Variant
+''' Return the list of public methods of the Database service as an array
+
+ Methods = Array( _
+ "DAvg" _
+ , "DCount" _
+ , "DLookup" _
+ , "DMax" _
+ , "DMin" _
+ , "DSum" _
+ , "GetRows" _
+ , "RunSql" _
+ )
+
+End Function ' SFDatabases.SF_Database.Methods
+
+REM -----------------------------------------------------------------------------
+Public Function Properties() As Variant
+''' Return the list or properties of the Database class as an array
+
+ Properties = Array( _
+ "Queries" _
+ , "Tables" _
+ , "XConnection" _
+ , "XMetaData" _
+ )
+
+End Function ' SFDatabases.SF_Database.Properties
+
+REM -----------------------------------------------------------------------------
+Public Function RunSql(Optional ByVal SQLCommand As Variant _
+ , Optional ByVal DirectSQL As Variant _
+ ) As Boolean
+''' Execute an action query (table creation, record insertion, ...) or SQL statement on the current database
+''' Args:
+''' SQLCommand: a query name or an SQL statement
+''' DirectSQL: when True, no syntax conversion is done by LO. Default = False
+''' Ignored when SQLCommand is a query name
+''' Exceptions:
+''' DBREADONLYERROR The method is not applicable on a read-only database
+''' Example:
+''' myDatabase.RunSql("INSERT INTO [EMPLOYEES] VALUES(25, 'SMITH', 'John')", DirectSQL := True)
+
+Dim bResult As Boolean ' Return value
+Dim oStatement As Object ' com.sun.star.sdbc.XStatement
+Dim iCommandType ' 1 = Table, 2 = Query, 3 = SQL
+Dim oQuery As Object ' com.sun.star.ucb.XContent
+Dim sSql As String ' SQL statement
+Dim bDirect ' Alias of DirectSQL
+Const cstQuery = 2, cstSql = 3
+Const cstThisSub = "SFDatabases.Database.RunSql"
+Const cstSubArgs = "SQLCommand, [DirectSQL=False]"
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ bResult = False
+
+Check:
+ If IsMissing(DirectSQL) Or IsEmpty(DirectSQL) Then DirectSQL = False
+ If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not ScriptForge.SF_Utils._Validate(SQLCommand, "SQLCommand", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(DirectSQL, "DirectSQL", ScriptForge.V_BOOLEAN) Then GoTo Finally
+ End If
+ If _ReadOnly Then GoTo Catch_ReadOnly
+
+Try:
+ ' Query of SQL ?
+ If ScriptForge.SF_Array.Contains(Queries, SQLCommand, CaseSensitive := True, SortOrder := "ASC") Then
+ Set oQuery = _Connection.Queries.getByName(SQLCommand)
+ sSql = oQuery.Command
+ bDirect = Not oQuery.EscapeProcessing
+ ElseIf Not ScriptForge.SF_String.StartsWith(SQLCommand, "SELECT", CaseSensitive := False) Then
+ sSql = SQLCommand
+ bDirect = DirectSQL
+ Else
+ GoTo Finally
+ End If
+
+ ' Execute command
+ bResult = _ExecuteSql(sSql, bDirect)
+
+Finally:
+ RunSql = bResult
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+Catch_ReadOnly:
+ ScriptForge.SF_Exception.RaiseFatal(DBREADONLYERROR)
+ GoTo Finally
+End Function ' SFDatabases.SF_Database.RunSql
+
+REM -----------------------------------------------------------------------------
+Public Function SetProperty(Optional ByVal PropertyName As Variant _
+ , Optional ByRef Value As Variant _
+ ) As Boolean
+''' Set a new value to the given property
+''' Args:
+''' PropertyName: the name of the property as a string
+''' Value: its new value
+''' Exceptions
+''' ARGUMENTERROR The property does not exist
+
+Const cstThisSub = "SFDatabases.Database.SetProperty"
+Const cstSubArgs = "PropertyName, Value"
+
+ If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ SetProperty = False
+
+Check:
+ If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not SF_Utils._Validate(PropertyName, "PropertyName", V_STRING, Properties()) Then GoTo Catch
+ End If
+
+Try:
+ Select Case UCase(PropertyName)
+ Case Else
+ End Select
+
+Finally:
+ SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database.SetProperty
+
+REM =========================================================== PRIVATE FUNCTIONS
+
+REM -----------------------------------------------------------------------------------------------------------------------
+Private Function _DFunction(ByVal psFunction As String _
+ , Optional ByVal pvExpression As Variant _
+ , Optional ByVal pvTableName As Variant _
+ , Optional ByVal pvCriteria As Variant _
+ , Optional ByVal pvOrderClause As Variant _
+ ) As Variant
+''' Build and execute a SQL statement computing the aggregate function psFunction
+''' on a field or expression pvExpression belonging to a table pvTableName
+''' filtered by a WHERE-clause pvCriteria.
+''' To order the results, a pvOrderClause may be precised.
+''' Only the 1st record will be retained anyway.
+''' Args:
+''' psFunction an optional aggregate function: SUM, COUNT, AVG, LOOKUP
+''' pvExpression: an SQL expression
+''' pvTableName: the name of a table, NOT surrounded with quoting char
+''' pvCriteria: an optional WHERE clause without the word WHERE
+''' pvOrderClause: an optional order clause incl. "DESC" if relevant
+''' (meaningful only for LOOKUP)
+
+Dim vResult As Variant ' Return value
+Dim oResult As Object ' com.sun.star.sdbc.XResultSet
+Dim sSql As String ' SQL statement.
+Dim sExpr As String ' For inclusion of aggregate function
+Dim sTarget as String ' Alias of pvExpression
+Dim sWhere As String ' Alias of pvCriteria
+Dim sOrderBy As String ' Alias of pvOrderClause
+Dim sLimit As String ' TOP 1 clause
+Dim sProductName As String ' RDBMS as a string
+Const cstAliasField = "[" & "TMP_ALIAS_ANY_FIELD" & "]" ' Alias field in SQL expression
+Dim cstThisSub As String : cstThisSub = "SFDatabases.SF_Database.D" & psFunction
+Const cstSubArgs = "Expression, TableName, [Criteria=""""], [OrderClause=""""]"
+Const cstLookup = "Lookup"
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ vResult = Null
+
+Check:
+ If IsMissing(pvCriteria) Or IsEmpty(pvCriteria) Then pvCriteria = ""
+ If IsMissing(pvOrderClause) Or IsEmpty(pvOrderClause) Then pvOrderClause = ""
+ If ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not ScriptForge.SF_Utils._Validate(pvExpression, "Expression", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(pvTableName, "TableName", V_STRING, Tables) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(pvCriteria, "Criteria", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(pvOrderClause, "OrderClause", V_STRING) Then GoTo Finally
+ End If
+
+Try:
+ If pvCriteria <> "" Then sWhere = " WHERE " & pvCriteria Else sWhere = ""
+ If pvOrderClause <> "" Then sOrderBy = " ORDER BY " & pvOrderClause Else sOrderBy = ""
+ sLimit = ""
+
+ pvTableName = "[" & pvTableName & "]"
+
+ sProductName = UCase(_MetaData.getDatabaseProductName())
+
+ Select Case sProductName
+ Case "MYSQL", "SQLITE"
+ If psFunction = cstLookup Then
+ sTarget = pvExpression
+ sLimit = " LIMIT 1"
+ Else
+ sTarget = UCase(psFunction) & "(" & pvExpression & ")"
+ End If
+ sSql = "SELECT " & sTarget & " AS " & cstAliasField & " FROM " & psTableName & sWhere & sOrderBy & sLimit
+ Case "FIREBIRD (ENGINE12)"
+ If psFunction = cstLookup Then sTarget = "FIRST 1 " & pvExpression Else sTarget = UCase(psFunction) & "(" & pvExpression & ")"
+ sSql = "SELECT " & sTarget & " AS " & cstAliasField & " FROM " & pvTableName & sWhere & sOrderBy
+ Case Else ' Standard syntax - Includes HSQLDB
+ If psFunction = cstLookup Then sTarget = "TOP 1 " & pvExpression Else sTarget = UCase(psFunction) & "(" & pvExpression & ")"
+ sSql = "SELECT " & sTarget & " AS " & cstAliasField & " FROM " & pvTableName & sWhere & sOrderBy
+ End Select
+
+ ' Execute the SQL statement and retain the first column of the first record
+ Set oResult = _ExecuteSql(sSql, True)
+ If Not IsNull(oResult) And Not IsEmpty(oResult) Then
+ If Not oResult.first() Then Goto Finally
+ If oResult.isAfterLast() Then GoTo Finally
+ vResult = _GetColumnValue(oResult, 1, True) ' Force return of binary field
+ End If
+ Set oResult = Nothing
+
+Finally:
+ _DFunction = vResult
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database._DFunction
+
+REM -----------------------------------------------------------------------------
+Private Function _ExecuteSql(ByVal psSql As String _
+ , ByVal pbDirect As Boolean _
+ ) As Variant
+''' Return a read-only Resultset based on a SELECT SQL statement or execute the given action SQL (INSERT, CREATE TABLE, ...)
+''' The method raises a fatal error when the SQL statement cannot be interpredted
+''' Args:
+''' psSql : the SQL statement. Square brackets are replaced by the correct field surrounding character
+''' pbDirect: when True, no syntax conversion is done by LO. Default = False
+''' Exceptions
+''' SQLSYNTAXERROR The given SQL statement is incorrect
+
+Dim vResult As Variant ' Return value - com.sun.star.sdbc.XResultSet or Boolean
+Dim oStatement As Object ' com.sun.star.sdbc.XStatement
+Dim sSql As String ' Alias of psSql
+Dim bSelect As Boolean ' True when SELECT statement
+Dim bErrorHandler As Boolean ' Can be set off to ease debugging of complex SQL statements
+
+ Set vResult = Nothing
+ bErrorHandler = ScriptForge.SF_Utils._ErrorHandling()
+ If bErrorHandler Then On Local Error GoTo Catch
+
+Try:
+ sSql = _ReplaceSquareBrackets(psSql)
+ bSelect = ScriptForge.SF_String.StartsWith(sSql, "SELECT", CaseSensitive := False)
+
+ Set oStatement = _Connection.createStatement()
+ With oStatement
+ If bSelect Then
+ .ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE
+ .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY
+ End If
+ .EscapeProcessing = Not pbDirect
+
+ ' Setup the result set
+ If bErrorHandler Then On Local Error GoTo Catch_Sql
+ If bSelect Then Set vResult = .executeQuery(sSql) Else vResult = .execute(sSql)
+ End With
+
+Finally:
+ _ExecuteSql = vResult
+ Set oStatement = Nothing
+ Exit Function
+Catch_Sql:
+ ScriptForge.SF_Exception.RaiseFatal(SQLSYNTAXERROR, sSql)
+ GoTo Finally
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database._ExecuteSql
+
+REM -----------------------------------------------------------------------------
+Private Function _GetColumnValue(ByRef poResultSet As Object _
+ , ByVal plColIndex As Long _
+ , Optional ByVal pbReturnBinary As Boolean _
+ ) As Variant
+''' Get the data stored in the current record of a result set in a given column
+''' The type of the column is found in the resultset's metadata
+''' Args:
+''' poResultSet: com.sun.star.sdbc.XResultSet
+''' plColIndex: the index of the column to extract the value from
+''' pbReturnBinary: when True, the method returns the content of a binary field,
+''' as long as its length does not exceed a maximum length.
+''' Default = False: binary fields are not returned, only their length
+''' Returns:
+''' The variant value found in the column
+''' Dates and times are returned as Basic dates
+''' Null values are returned as Null
+''' Errors or strange data types are returned as Null as well
+
+Dim vValue As Variant ' Return value
+Dim lType As Long ' SQL column type: com.sun.star.sdbc.DataType
+Dim vDateTime As Variant ' com.sun.star.util.DateTime
+Dim oStream As Object ' Long character or binary streams
+Dim bNullable As Boolean ' The field is defined as accepting Null values
+Dim lSize As Long ' Binary field length
+
+Const cstMaxBinlength = 2 * 65535
+
+ On Local Error Goto 0 ' Disable error handler
+ vValue = Null ' Default value if error
+ If IsMissing(pbReturnBinary) Then pbReturnBinary = False
+
+ With com.sun.star.sdbc.DataType
+ lType = poResultSet.MetaData.getColumnType(plColIndex)
+ bNullable = ( poResultSet.MetaData.IsNullable(plColIndex) = com.sun.star.sdbc.ColumnValue.NULLABLE )
+
+ Select Case lType
+ Case .ARRAY : vValue = poResultSet.getArray(plColIndex)
+ Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB
+ Set oStream = poResultSet.getBinaryStream(plColIndex)
+ If bNullable Then
+ If Not poResultSet.wasNull() Then
+ If Not ScriptForge.SF_Session.HasUNOMethod(oStream, "getLength") Then ' When no recordset
+ lSize = cstMaxBinLength
+ Else
+ lSize = CLng(oValue.getLength())
+ End If
+ If lSize <= cstMaxBinLength And pbReturnBinary Then
+ vValue = Array()
+ oValue.readBytes(vValue, lSize)
+ Else ' Return length of field, not content
+ vValue = lSize
+ End If
+ End If
+ End If
+ oValue.closeInput()
+ Case .BIT, .BOOLEAN : vValue = poResultSet.getBoolean(plColIndex)
+ Case .DATE
+ vDateTime = poResultSet.getDate(plColIndex)
+ If Not poResultSet.wasNull() Then vValue = DateSerial(CInt(vDateTime.Year), CInt(vDateTime.Month), CInt(vDateTime.Day))
+ Case .DISTINCT, .OBJECT, .OTHER, .STRUCT
+ vValue = Null
+ Case .DOUBLE, .REAL : vValue = poResultSet.getDouble(plColIndex)
+ Case .FLOAT : vValue = poResultSet.getFloat(plColIndex)
+ Case .INTEGER, .SMALLINT : vValue = poResultSet.getInt(plColIndex)
+ Case .BIGINT : vValue = CLng(poResultSet.getLong(plColIndex))
+ Case .DECIMAL, .NUMERIC : vValue = poResultSet.getDouble(plColIndex)
+ Case .SQLNULL : vValue = poResultSet.getNull(plColIndex)
+ Case .OBJECT, .OTHER, .STRUCT : vValue = Null
+ Case .REF : vValue = poResultSet.getRef(plColIndex)
+ Case .TINYINT : vValue = poResultSet.getShort(plColIndex)
+ Case .CHAR, .VARCHAR : vValue = poResultSet.getString(plColIndex)
+ Case .LONGVARCHAR, .CLOB
+ If bNullable Then
+ If Not poResultSet.wasNull() Then vValue = poResultSet.getString(plColIndex)
+ Else
+ vValue = ""
+ End If
+ Case .TIME
+ vDateTime = poResultSet.getTime(plColIndex)
+ If Not poResultSet.wasNull() Then vValue = TimeSerial(vDateTime.Hours, vDateTime.Minutes, vDateTime.Seconds)', vDateTime.HundredthSeconds)
+ Case .TIMESTAMP
+ vDateTime = poResultSet.getTimeStamp(plColIndex)
+ If Not poResultSet.wasNull() Then vValue = DateSerial(CInt(vDateTime.Year), CInt(vDateTime.Month), CInt(vDateTime.Day)) _
+ + TimeSerial(vDateTime.Hours, vDateTime.Minutes, vDateTime.Seconds)', vDateTime.HundredthSeconds)
+ Case Else
+ vValue = poResultSet.getString(plColIndex) 'GIVE STRING A TRY
+ If IsNumeric(vValue) Then vValue = Val(vValue) 'Required when type = "", sometimes numeric fields are returned as strings (query/MSAccess)
+ End Select
+ If bNullable Then
+ If poResultSet.wasNull() Then vValue = Null
+ End If
+ End With
+
+ _GetColumnValue = vValue
+
+End Function ' SFDatabases.SF_Database.GetColumnValue
+
+REM -----------------------------------------------------------------------------
+Public Sub _Initialize()
+''' Complete the object creation process:
+''' - Initialization of private members
+''' - Creation of the dialog graphical interface
+''' - Addition of the new object in the Dialogs buffer
+
+Try:
+ ' Create the graphical interface
+ Set _DialogControl = CreateUnoDialog(_DialogProvider)
+ Set _DialogModel = _DialogControl.Model
+
+ ' Add dialog reference to cache
+ _CacheIndex = SF_Register._AddDialogToCache(_DialogControl, [Me])
+ 85
+Finally:
+ Exit Sub
+End Sub ' SFDatabases.SF_Database._Initialize
+
+REM -----------------------------------------------------------------------------
+Private Function _PropertyGet(Optional ByVal psProperty As String) As Variant
+''' Return the value of the named property
+''' Args:
+''' psProperty: the name of the property
+
+Dim cstThisSub As String
+Const cstSubArgs = ""
+
+ cstThisSub = "SFDatabases.Database.get" & psProperty
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+ ScriptForge.SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
+
+ Select Case psProperty
+ Case "Queries"
+ If Not IsNull(_Connection) Then _PropertyGet = _Connection.Queries.getElementNames() Else _PropertyGet = Array()
+ Case "Tables"
+ If Not IsNull(_Connection) Then _PropertyGet = _Connection.Tables.getElementNames() Else _PropertyGet = Array()
+ Case "XConnection"
+ Set _PropertyGet = _Connection
+ Case "XMetaData"
+ Set _PropertyGet = _MetaData
+ Case Else
+ _PropertyGet = Null
+ End Select
+
+Finally:
+ ScriptForge.SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Database._PropertyGet
+
+REM -----------------------------------------------------------------------------
+Private Function _ReplaceSquareBrackets(ByVal psSql As String) As String
+''' Returns the input SQL command after replacement of square brackets by the table/field names quoting character
+
+Dim sSql As String ' Return value
+Dim sQuote As String ' RDBMS specific table/field surrounding character
+Dim sConstQuote As String ' Delimiter for string constants in SQL - usually the single quote
+Const cstDouble = """" : Const cstSingle = "'"
+
+Try:
+ sQuote = _MetaData.IdentifierQuoteString
+ sConstQuote = Iif(sQuote = cstSingle, cstDouble, cstSingle)
+
+ ' Replace the square brackets
+ sSql = Join(ScriptForge.SF_String.SplitNotQuoted(psSql, "[", , sConstQuote), sQuote)
+ sSql = Join(ScriptForge.SF_String.SplitNotQuoted(sSql, "]", , sConstQuote), sQuote)
+
+Finally:
+ _ReplaceSquareBrackets = sSql
+ Exit Function
+End Function ' SFDatabases.SF_Database._ReplaceSquareBrackets
+
+REM -----------------------------------------------------------------------------
+Private Function _Repr() As String
+''' Convert the Database instance to a readable string, typically for debugging purposes (DebugPrint ...)
+''' Args:
+''' Return:
+''' "[DATABASE]: Location (Statusbar)"
+
+ _Repr = "[DATABASE]: " & _Location & " (" & _URL & ")"
+
+End Function ' SFDatabases.SF_Database._Repr
+
+REM ============================================ END OF SFDATABASES.SF_DATABASE
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdatabases/SF_Register.xba b/wizards/source/sfdatabases/SF_Register.xba
new file mode 100644
index 000000000000..63ad2085d772
--- /dev/null
+++ b/wizards/source/sfdatabases/SF_Register.xba
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
+<script:module xmlns:script="http://openoffice.org/2000/script" script:name="SF_Register" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
+REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. ===
+REM === The SFDatabases library is one of the associated libraries. ===
+REM === Full documentation is available on https://help.libreoffice.org/ ===
+REM =======================================================================================================================
+
+Option Compatible
+Option Explicit
+
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+''' SF_Register
+''' ===========
+''' The ScriptForge framework includes
+''' the master ScriptForge library
+''' a number of "associated" libraries SF*
+''' any user/contributor extension wanting to fit into the framework
+'''
+''' The main methods in this module allow the current library to cling to ScriptForge
+''' - RegisterScriptServices
+''' Register the list of services implemented by the current library
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+REM ================================================================== EXCEPTIONS
+
+Private Const BASEDOCUMENTOPENERROR = "BASEDOCUMENTOPENERROR"
+
+REM ============================================================== PUBLIC METHODS
+
+REM -----------------------------------------------------------------------------
+Public Sub RegisterScriptServices() As Variant
+''' Register into ScriptForge the list of the services implemented by the current library
+''' Each library pertaining to the framework must implement its own version of this method
+'''
+''' It consists in successive calls to the RegisterService() and RegisterEventManager() methods
+''' with 2 arguments:
+''' ServiceName: the name of the service as a case-insensitive string
+''' ServiceReference: the reference as an object
+''' If the reference refers to a module, then return the module as an object:
+''' GlobalScope.Library.Module
+''' If the reference is a class instance, then return a string referring to the method
+''' containing the New statement creating the instance
+''' "libraryname.modulename.function"
+
+ With GlobalScope.ScriptForge.SF_Services
+ .RegisterService("Database", "SFDatabases.SF_Register._NewDatabase") ' Reference to the function initializing the service
+ .RegisterService("DatabaseFromDocument", "SFDatabases.SF_Register._NewDatabaseFromSource")
+ End With
+
+End Sub ' SFDatabases.SF_Register.RegisterScriptServices
+
+REM =========================================================== PRIVATE FUNCTIONS
+
+REM -----------------------------------------------------------------------------
+Public Function _NewDatabase(Optional ByVal pvArgs As Variant) As Object
+''' Create a new instance of the SF_Database class
+' Args:
+''' FileName : the name of the file (compliant with the SF_FileSystem.FileNaming notation)
+''' RegistrationName: mutually exclusive with FileName. Used when database is registered
+''' ReadOnly : (boolean). Default = True
+''' User : connection parameters
+''' Password
+''' Returns:
+''' The instance or Nothing
+''' Exceptions:
+''' BASEDOCUMENTOPENERROR The database file could not be opened or connected
+
+Dim oDatabase As Object ' Return value
+Dim vFileName As Variant ' alias of pvArgs(0)
+Dim vRegistration As Variant ' Alias of pvArgs(1)
+Dim vReadOnly As Variant ' Alias of pvArgs(2)
+Dim vUser As Variant ' Alias of pvArgs(3)
+Dim vPassword As Variant ' Alias of pvArgs(4)
+Dim oDBContext As Object ' com.sun.star.sdb.DatabaseContext
+Const cstService = "SFDatabases.Database"
+Const cstGlobal = "GlobalScope"
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+
+Check:
+ If IsMissing(pvArgs) Or IsEmpty(pvArgs) Then pvArgs = Array()
+ If UBound(pvArgs) >= 0 Then vFileName = pvArgs(0) Else vFileName = ""
+ If IsEmpty(vFileName) Then vFileName = ""
+ If UBound(pvArgs) >= 1 Then vRegistration = pvArgs(1) Else vRegistration = ""
+ If IsEmpty(vRegistration) Then vRegistration = ""
+ If UBound(pvArgs) >= 2 Then vReadOnly = pvArgs(2) Else vReadOnly = True
+ If IsEmpty(vReadOnly) Then vReadOnly = True
+ If UBound(pvArgs) >= 3 Then vUser = pvArgs(3) Else vUser = ""
+ If IsEmpty(vUser) Then vUser = ""
+ If UBound(pvArgs) >= 4 Then vPassword = pvArgs(4) Else vPassword = ""
+ If IsEmpty(vPassword) Then vPassword = ""
+ If Not ScriptForge.SF_Utils._Validate(vFileName, "FileName", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(vRegistration, "RegistrationName", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(vReadOnly, "ReadOnly", ScriptForge.V_BOOLEAN) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(vUser, "User", V_STRING) Then GoTo Finally
+ If Not ScriptForge.SF_Utils._Validate(vPassword, "Password", V_STRING) Then GoTo Finally
+ Set oDatabase = Nothing
+
+ ' Check the existence of FileName
+ With ScriptForge
+ Set oDBContext = .SF_Utils._GetUNOService("DatabaseContext")
+ If Len(vFileName) = 0 Then ' FileName has precedence over RegistrationName
+ If Len(vRegistration) = 0 Then GoTo CatchError
+ If Not oDBContext.hasRegisteredDatabase(vRegistration) Then GoTo CatchError
+ vFileName = .SF_FileSystem._ConvertFromUrl(oDBContext.getDatabaseLocation(vRegistration))
+ End If
+ If Not .SF_FileSystem.FileExists(vFileName) Then GoTo CatchError
+ End With
+
+Try:
+ ' Create the database Basic object and initialize attributes
+ Set oDatabase = New SF_Database
+ With oDatabase
+ Set .[Me] = oDatabase
+ ._Location = ConvertToUrl(vFileName)
+ Set ._DataSource = oDBContext.getByName(._Location)
+ Set ._Connection = ._DataSource.getConnection(vUser, vPassword)
+ ._ReadOnly = vReadOnly
+ Set ._MetaData = ._Connection.MetaData
+ ._URL = ._MetaData.URL
+ End With
+
+Finally:
+ Set _NewDatabase = oDatabase
+ Exit Function
+Catch:
+ GoTo Finally
+CatchError:
+ ScriptForge.SF_Exception.RaiseFatal(BASEDOCUMENTOPENERROR, "FileName", vFileName, "RegistrationName", vRegistration)
+ GoTo Finally
+End Function ' SFDatabases.SF_Register._NewDatabase
+
+REM -----------------------------------------------------------------------------
+Public Function _NewDatabaseFromSource(Optional ByVal pvArgs As Variant) As Object
+'ByRef poDataSource As Object _
+' , ByVal psUser As String _
+' , ByVal psPassword As String _
+' ) As Object
+''' Create a new instance of the SF_Database class from the given datasource
+''' established in the SFDocuments.Base service
+''' THIS SERVICE MUST NOT BE CALLED FROM A USER SCRIPT
+' Args:
+''' DataSource: com.sun.star.sdbc.XDataSource
+''' User, Password : connection parameters
+''' Returns:
+''' The instance or Nothing
+''' Exceptions:
+''' managed in the calling routines when Nothing is returned
+
+Dim oDatabase As Object ' Return value
+Dim oConnection As Object ' com.sun.star.sdbc.XConnection
+Dim oDataSource As Object ' Alias of pvArgs(0)
+Dim sUser As String ' Alias of pvARgs(1)
+Dim sPassword As String ' Alias of pvARgs(2)
+
+ If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ Set oDatabase = Nothing
+
+Try:
+ ' Get arguments
+ Set oDataSource = pvArgs(0)
+ sUser = pvArgs(1)
+ sPassword = pvArgs(2)
+
+ ' Setup the connection
+ If oDataSource.IsPasswordRequired Then
+ Set oConnection = oDataSource.getConnection(sUser, sPassword)
+ Else
+ Set oConnection = oDataSource.getConnection("", "")
+ End If
+
+ ' Create the database Basic object and initialize attributes
+ If Not IsNull(oConnection) Then
+ Set oDatabase = New SF_Database
+ With oDatabase
+ Set .[Me] = oDatabase
+ ._Location = ""
+ Set ._DataSource = oDataSource
+ Set ._Connection = oConnection
+ ._ReadOnly = oConnection.isReadOnly()
+ Set ._MetaData = oConnection.MetaData
+ ._URL = ._MetaData.URL
+ End With
+ End If
+
+Finally:
+ Set _NewDatabaseFromSource = oDatabase
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDatabases.SF_Register._NewDatabaseFromSource
+
+REM ============================================== END OF SFDATABASES.SF_REGISTER
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdatabases/__License.xba b/wizards/source/sfdatabases/__License.xba
new file mode 100644
index 000000000000..1c4098f89c3d
--- /dev/null
+++ b/wizards/source/sfdatabases/__License.xba
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
+<script:module xmlns:script="http://openoffice.org/2000/script" script:name="__License" script:language="StarBasic" script:moduleType="normal">
+''' Copyright 2019-2020 Jean-Pierre LEDURE, Jean-François NIFENECKER, Alain ROMEDENNE
+
+REM =======================================================================================================================
+REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. ===
+REM === The SFDatabases library is one of the associated libraries. ===
+REM === Full documentation is available on https://help.libreoffice.org/ ===
+REM =======================================================================================================================
+
+''' ScriptForge 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.
+
+''' ScriptForge is free software; you can redistribute it and/or modify it under the terms of either (at your option):
+
+''' 1) The Mozilla Public License, v. 2.0. If a copy of the MPL was not
+''' distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/ .
+
+''' 2) The GNU Lesser General Public License as published by
+''' the Free Software Foundation, either version 3 of the License, or
+''' (at your option) any later version. If a copy of the LGPL was not
+''' distributed with this file, see http://www.gnu.org/licenses/ .
+
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdatabases/dialog.xlb b/wizards/source/sfdatabases/dialog.xlb
new file mode 100644
index 000000000000..8b62d721a868
--- /dev/null
+++ b/wizards/source/sfdatabases/dialog.xlb
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd">
+<library:library xmlns:library="http://openoffice.org/2000/library" library:name="SFDatabases" library:readonly="false" library:passwordprotected="false"/>
\ No newline at end of file
diff --git a/wizards/source/sfdatabases/script.xlb b/wizards/source/sfdatabases/script.xlb
new file mode 100644
index 000000000000..6cea80d2a912
--- /dev/null
+++ b/wizards/source/sfdatabases/script.xlb
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd">
+<library:library xmlns:library="http://openoffice.org/2000/library" library:name="SFDatabases" library:readonly="false" library:passwordprotected="false">
+ <library:element library:name="SF_Register"/>
+ <library:element library:name="__License"/>
+ <library:element library:name="SF_Database"/>
+</library:library>
\ No newline at end of file
More information about the Libreoffice-commits
mailing list