<?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

&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
&apos;&apos;&apos;	SF_Register
&apos;&apos;&apos;	===========
&apos;&apos;&apos;		The ScriptForge framework includes
&apos;&apos;&apos;			the master ScriptForge library
&apos;&apos;&apos;			a number of &quot;associated&quot; libraries SF*
&apos;&apos;&apos;			any user/contributor extension wanting to fit into the framework 
&apos;&apos;&apos;
&apos;&apos;&apos;		The main methods in this module allow the current library to cling to ScriptForge
&apos;&apos;&apos;			- RegisterScriptServices
&apos;&apos;&apos;				Register the list of services implemented by the current library
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;

REM ================================================================== EXCEPTIONS

Private Const BASEDOCUMENTOPENERROR	=	&quot;BASEDOCUMENTOPENERROR&quot;

REM ============================================================== PUBLIC METHODS

REM -----------------------------------------------------------------------------
Public Sub RegisterScriptServices() As Variant
&apos;&apos;&apos;	Register into ScriptForge the list of the services implemented by the current library
&apos;&apos;&apos;	Each library pertaining to the framework must implement its own version of this method
&apos;&apos;&apos;
&apos;&apos;&apos;	It consists in successive calls to the RegisterService() and RegisterEventManager() methods
&apos;&apos;&apos;	with 2 arguments:
&apos;&apos;&apos;		ServiceName: the name of the service as a case-insensitive string
&apos;&apos;&apos;		ServiceReference: the reference as an object
&apos;&apos;&apos;			If the reference refers to a module, then return the module as an object:
&apos;&apos;&apos;				GlobalScope.Library.Module
&apos;&apos;&apos;			If the reference is a class instance, then return a string referring to the method
&apos;&apos;&apos;			containing the New statement creating the instance
&apos;&apos;&apos;				&quot;libraryname.modulename.function&quot;

	With GlobalScope.ScriptForge.SF_Services
		.RegisterService(&quot;Database&quot;,				&quot;SFDatabases.SF_Register._NewDatabase&quot;)		&apos;	Reference to the function initializing the service
		.RegisterService(&quot;DatabaseFromDocument&quot;,	&quot;SFDatabases.SF_Register._NewDatabaseFromSource&quot;)
	End With

End Sub			&apos;	SFDatabases.SF_Register.RegisterScriptServices

REM =========================================================== PRIVATE FUNCTIONS

REM -----------------------------------------------------------------------------
Public Function _NewDatabase(Optional ByVal pvArgs As Variant) As Object
&apos;&apos;&apos;	Create a new instance of the SF_Database class
&apos;	Args:
&apos;&apos;&apos;		FileName : the name of the file (compliant with the SF_FileSystem.FileNaming notation)
&apos;&apos;&apos;		RegistrationName: mutually exclusive with FileName. Used when database is registered
&apos;&apos;&apos;		ReadOnly : (boolean). Default = True
&apos;&apos;&apos;		User : connection parameters
&apos;&apos;&apos;		Password
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		The instance or Nothing
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		BASEDOCUMENTOPENERROR		The database file could not be opened or connected

Dim oDatabase As Object					&apos;	Return value
Dim vFileName As Variant				&apos;	alias of pvArgs(0)
Dim vRegistration As Variant			&apos;	Alias of pvArgs(1)
Dim vReadOnly As Variant				&apos;	Alias of pvArgs(2)
Dim vUser As Variant					&apos;	Alias of pvArgs(3)
Dim vPassword As Variant				&apos;	Alias of pvArgs(4)
Dim oDBContext As Object				&apos;	com.sun.star.sdb.DatabaseContext
Const cstService = &quot;SFDatabases.Database&quot;
Const cstGlobal = &quot;GlobalScope&quot;

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch

Check:
	If IsMissing(pvArgs) Or IsEmpty(pvArgs) Then pvArgs = Array()
	If UBound(pvArgs) &gt;= 0 Then vFileName = pvArgs(0) Else vFileName = &quot;&quot;
	If IsEmpty(vFileName) Then vFileName = &quot;&quot;
	If UBound(pvArgs) &gt;= 1 Then vRegistration = pvArgs(1) Else vRegistration = &quot;&quot;
	If IsEmpty(vRegistration) Then vRegistration = &quot;&quot;
	If UBound(pvArgs) &gt;= 2 Then vReadOnly = pvArgs(2) Else vReadOnly = True
	If IsEmpty(vReadOnly) Then vReadOnly = True
	If UBound(pvArgs) &gt;= 3 Then vUser = pvArgs(3) Else vUser = &quot;&quot;
	If IsEmpty(vUser) Then vUser = &quot;&quot;
	If UBound(pvArgs) &gt;= 4 Then vPassword = pvArgs(4) Else vPassword = &quot;&quot;
	If IsEmpty(vPassword) Then vPassword = &quot;&quot;
	If Not ScriptForge.SF_Utils._Validate(vFileName, &quot;FileName&quot;, V_STRING) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(vRegistration, &quot;RegistrationName&quot;, V_STRING) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(vReadOnly, &quot;ReadOnly&quot;, ScriptForge.V_BOOLEAN) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(vUser, &quot;User&quot;, V_STRING) Then GoTo Finally
	If Not ScriptForge.SF_Utils._Validate(vPassword, &quot;Password&quot;, V_STRING) Then GoTo Finally
	Set oDatabase = Nothing

	&apos;	Check the existence of FileName
	With ScriptForge
		Set oDBContext = .SF_Utils._GetUNOService(&quot;DatabaseContext&quot;)
		If Len(vFileName) = 0 Then	&apos;	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:
	&apos;	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, &quot;FileName&quot;, vFileName, &quot;RegistrationName&quot;, vRegistration)
	GoTo Finally
End Function	&apos;	SFDatabases.SF_Register._NewDatabase

REM -----------------------------------------------------------------------------
Public Function _NewDatabaseFromSource(Optional ByVal pvArgs As Variant) As Object
&apos;										ByRef poDataSource As Object _
&apos;											, ByVal psUser As String _
&apos;											, ByVal psPassword As String _
&apos;											) As Object
&apos;&apos;&apos;	Create a new instance of the SF_Database class from the given datasource
&apos;&apos;&apos;	established in the SFDocuments.Base service
&apos;&apos;&apos;	THIS SERVICE MUST NOT BE CALLED FROM A USER SCRIPT
&apos;	Args:
&apos;&apos;&apos;		DataSource: 	com.sun.star.sdbc.XDataSource
&apos;&apos;&apos;		User, Password : connection parameters
&apos;&apos;&apos;	Returns:
&apos;&apos;&apos;		The instance or Nothing
&apos;&apos;&apos;	Exceptions:
&apos;&apos;&apos;		managed in the calling routines when Nothing is returned

Dim oDatabase As Object					&apos;	Return value
Dim oConnection As Object				&apos;	com.sun.star.sdbc.XConnection
Dim oDataSource As Object				&apos;	Alias of pvArgs(0)
Dim sUser As String						&apos;	Alias of pvARgs(1)
Dim sPassword As String					&apos;	Alias of pvARgs(2)

	If ScriptForge.SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
	Set oDatabase = Nothing

Try:
	&apos;	Get arguments
	Set oDataSource = pvArgs(0)
	sUser = pvArgs(1)
	sPassword = pvArgs(2)

	&apos;	Setup the connection
	If oDataSource.IsPasswordRequired Then
		Set oConnection = oDataSource.getConnection(sUser, sPassword)
	Else
		Set oConnection = oDataSource.getConnection(&quot;&quot;, &quot;&quot;)
	End If

	&apos;	Create the database Basic object and initialize attributes
	If Not IsNull(oConnection) Then
		Set oDatabase = New SF_Database
		With oDatabase
			Set .[Me] = oDatabase
			._Location = &quot;&quot;
			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	&apos;	SFDatabases.SF_Register._NewDatabaseFromSource

REM ============================================== END OF SFDATABASES.SF_REGISTER
</script:module>