diff --git a/src/Connection.jl b/src/Connection.jl index d9e53f9dd425c70cc7dd3b109ba97479d456ffc5..339df952cfc0872750dbe901fef53057bff32a3e 100644 --- a/src/Connection.jl +++ b/src/Connection.jl @@ -25,7 +25,7 @@ module Connection using ..CaosDB -export connect +export connect, connect_manually """ Struct containing the actual connection to a CaosDB server. Meant for @@ -35,11 +35,13 @@ to create an connection object from a configuration. mutable struct _Connection wrapped_connection::Ptr{Cvoid} - function _Connection() + function _Connection(managed_by_julia::Bool=false) conn = new() - conn.wrapped_connection = C_NULL - function f(t) - if t.wrapped_connection != C_NULL + if managed_by_julia + # Only append a finalizer for this if the object is + # actually managed by Julia and not created and destroyed + # internally by libcaosdb. + function f(t) ccall( (:caosdb_connection_delete_connection, "libccaosdb"), Cint, @@ -47,8 +49,9 @@ mutable struct _Connection Ref{_Connection}(t), ) end + finalizer(f, conn) end - finalizer(f, conn) + return conn end end @@ -61,11 +64,13 @@ an certificate-provider object from a configuration. mutable struct _CertificateProvider wrapped_certificate_provider::Ptr{Cvoid} - function _CertificateProvider() + function _CertificateProvider(managed_by_julia::Bool=false) prov = new() - prov.wrapped_certificate_provider = C_NULL - function f(t) - if t.wrapped_certificate_provider != C_NULL + if managed_by_julia + # Only append a finalizer for this if the object is + # actually managed by Julia and not created and destroyed + # internally by libcaosdb. + function f(t) ccall( (:caosdb_connection_delete_certificate_provider, "libccaosdb"), Cint, @@ -73,8 +78,9 @@ mutable struct _CertificateProvider Ref{_CertificateProvider}(t), ) end + finalizer(f, prov) end - finalizer(f, prov) + return prov end end @@ -87,11 +93,10 @@ an connection-configuration object from a configuration. mutable struct _Configuration wrapped_connection_configuration::Ptr{Cvoid} - function _Configuration() + function _Configuration(managed_by_julia::Bool=false) config = new() - config.wrapped_connection_configuration = C_NULL - function f(t) - if t.wrapped_connection_configuration != C_NULL + if managed_by_julia + function f(t) ccall( (:caosdb_connection_delete_connection_configuration, "libccaosdb"), Cint, @@ -99,8 +104,9 @@ mutable struct _Configuration Ref{_Configuration}(t), ) end + finalizer(f, config) end - finalizer(f, config) + return config end end @@ -112,7 +118,7 @@ Return a `_CertificateProvider` for the pem certificate located at """ function create_pem_file_certificate_provider(path::AbstractString) - cert_provider = Ref{_CertificateProvider}(_CertificateProvider()) + cert_provider = Ref{_CertificateProvider}(_CertificateProvider(true)) err_code = ccall( (:caosdb_connection_create_pem_file_certificate_provider, "libccaosdb"), @@ -149,7 +155,7 @@ function create_tls_connection_configuration( provider::Ref{_CertificateProvider}, ) - config = Ref{_Configuration}(_Configuration()) + config = Ref{_Configuration}(_Configuration(true)) err_code = ccall( (:caosdb_connection_create_tls_connection_configuration, "libccaosdb"), @@ -180,7 +186,7 @@ end function create_insecure_connection_configuration(host::AbstractString, port::Cint) - config = Ref{_Configuration}(_Configuration()) + config = Ref{_Configuration}(_Configuration(true)) err_code = ccall( (:caosdb_connection_create_insecure_connection_configuration, "libccaosdb"), @@ -207,7 +213,7 @@ Return a connection based on the given `config`. """ function create_connection(config::Ref{_Configuration}) - connection = Ref{_Connection}(_Connection()) + connection = Ref{_Connection}(_Connection(true)) err_code = ccall( (:caosdb_connection_create_connection, "libccaosdb"), @@ -227,6 +233,39 @@ function create_connection(config::Ref{_Configuration}) end + +function get_connection(name::AbstractString="default") + + connection = Ref{_Connection}(_Connection()) + + if name == "default" + err_code = ccall( + (:caosdb_connection_connection_manager_get_default_connection, "libccaosdb"), + Cint, + (Ref{_Connection},), + connection + ) + else + err_code = ccall( + (:caosdb_connection_connection_manager_get_connection, "libccaosdb"), + Cint, + (Ref{_Connection}, Cstring), + connection, + name + ) + end + + if err_code != 0 + + @error "Creating connection '$name' failed with code $err_code" + + end + + return connection + +end + + """ get_version_info(con::Ref{_Connection}) @@ -235,7 +274,7 @@ to. """ function get_version_info(con::Ref{_Connection}) - info = Ref{CaosDB.Info._VersionInfo}(CaosDB.Info._VersionInfo()) + info = Ref{CaosDB.Info._VersionInfo}(CaosDB.Info._VersionInfo(true)) err_code = ccall( (:caosdb_connection_get_version_info, "libccaosdb"), @@ -280,7 +319,7 @@ function print_version_info(con::Ref{_Connection}) end """ - function connect([; + function connect_manually([; host::AbstractString="", port_str::AbstractString="undefined", cacert::AbstractString="", @@ -325,7 +364,7 @@ SSL certificate located at `cacert` with the given credentials. not defined, "caosdb" is used. The default value is "undefined" rather than an empty string to allow an empty password. """ -function connect(; +function connect_manually(; host::AbstractString = "", port_str::AbstractString = "undefined", cacert::AbstractString = "", @@ -376,4 +415,24 @@ function connect(; end +""" + connect(name::AbstractString="default") + +Create a connection with name `name` from your configuration file, +print the version of the server the connection is established to, and +return the connection object. + +# Arguments + +- name::AbstractString="default": The name of the configuration + defined in your config json that will be used to connect to the + CaosDB server defined therein. Default value is "default". +""" +function connect(name::AbstractString="default") conn = get_connection(name) + + print_version_info(conn) + + return conn +end + end # Connection