The mi_lo_copy() function

The mi_lo_copy() function creates a copy of a smart large object and opens the copy.

Syntax

MI_LO_FD mi_lo_copy(conn, src_LOhdl, LO_spec, open_mode, target_LOhdl_dptr)
   MI_CONNECTION *conn;
   MI_LO_HANDLE *src_LOhdl;
   MI_LO_SPEC *LO_spec;
   mi_integer open_mode;
   MI_LO_HANDLE **target_LOhdl_dptr;
conn
This value is one of the following connection values:

A pointer to a connection descriptor established by a previous call to mi_open(), mi_server_connect(), or mi_server_reconnect().

A NULL-valued pointer (database server only)

src_LOhdl
A pointer to the LO handle for the existing smart large object that is to be copied.
LO_spec
A pointer to the LO-specification structure that contains the storage characteristics to use for the new smart large object.
open_mode
An integer bitmask that specifies the open mode for the new smart large object that target_LOhdl_dptr references.
target_LOhdl_dptr
A doubly indirected pointer to the target LO handle that identifies the new smart large object where mi_lo_copy() copies the data in the smart large object that src_LOhdl references.
Valid in client LIBMI application? Valid in user-defined routine?
Yes Yes

Usage

The mi_lo_copy() function performs the following steps to create a new smart large object whose data is copied from the smart large object that src_LOhdl references:
  1. It obtains an LO handle for the new smart large object and assigns a pointer to the LO handle that target_LOhdl_dptr references.

    If the target_LOhdl_dptr value points to NULL, mi_lo_copy() allocates a new LO handle for the new smart large object and assigns a pointer to this handle to target_LOhdl_dptr. If target_LOhdl_dptr does not point to NULL, mi_lo_copy() assumes that you have already allocated an LO handle and uses the target_LOhdl_dptr argument as a pointer to an existing LO handle.

  2. It assigns the storage characteristics from the LO-specification structure, LO_spec, to the new smart large object.

    If the LO-specification structure has not been updated with storage characteristics (the associated fields are null), the mi_lo_copy() function uses the system-specified storage characteristics.

    If the LO-specification structure was updated with storage characteristics, mi_lo_copy() uses the storage characteristics that the LO-specification structure defines for the new smart large object.

  3. It opens the new smart large object in the open mode that the open_mode argument specifies.

    The bit mask value for the open_mode argument indicates the open mode of the smart large object after mi_lo_copy() successfully completes. For more information about valid open-mode flags, see the HCL OneDB™ DataBlade® API Programmer's Guide.

  4. It copies the contents of the data in the smart large object that src_LOhdl references into the new smart large object that target_LOhdl_dptr references.

    The mi_lo_copy() function writes the source data to the sbspace of the new smart large object.

  5. It returns an LO file descriptor that identifies the new smart large object and is positioned at the start of this smart large object.

    When the mi_lo_copy() function is successful, it returns a valid LO file descriptor. You can then use this file descriptor to identify which smart large object to access in subsequent function calls, such as mi_lo_read() and mi_lo_write().

The mi_lo_copy() function is a constructor function for both an LO file descriptor and an LO handle.

Server only: If the mi_lo_copy() function allocates an LO handle, it allocates this LO handle in the current memory duration. The mi_lo_copy() function does not allocate memory for the LO file descriptor. Your UDR can assign this LO file descriptor to user memory with a desired memory duration.

Each mi_lo_copy() call is implicitly associated with the current session. When this session ends, the database server deallocates any smart large objects that mi_lo_copy() has created if its LO handle has not been stored in a column (its reference count is zero) and no open LO file descriptors exist for the smart large object.

Server only: The mi_lo_copy() function does not need a connection descriptor to execute. If your UDR does not need a valid connection for other operations, you can specify a NULL-valued pointer for the conn parameter to establish a NULL connection. For information about the advantages of a NULL connection, see the HCL OneDB DataBlade API Programmer's Guide.

Return values

An MI_LO_FD value
The LO file descriptor for the open smart large object that target_LOhdl_dptr references. The function also initializes the LO handle that target_LOhdl_dptr references.
MI_ERROR
The function was not successful.