Otra Implementación de $lb() // iris-dollar-list
1. iris-dollar-list
Intérprete de $list para python llamado DollarList.
He hecho este intérprete porque:
- Quería usar $list en python
- Python Embebido no es compatible con $list
- La versión de API nativa no es compatible con $list embebido en $list
Este es un trabajo en desarrollo. Hasta ahora, solo es compatible con $list embebido en $list, int y string.
Trabajo en progreso: float, decimal, double
Este módulo está disponible en Pypi:
pip3 install iris-dollar-list
Es compatible con Python Embebido y API nativa.
1.1. Índice
1.2. Uso
Ejemplo:
set ^list = $lb("test",$lb(4))
Ejemplo de uso con API nativa:
import iris
from iris_dollar_list import DollarList
conn = iris.connect("localhost", 57161,"IRISAPP", "SuperUser", "SYS")
iris_obj = iris.createIRIS(conn)
gl = iris_obj.get("^list")
my_list = DollarList.from_bytes(gl.encode('ascii'))
print(my_list.to_list())
# ['test', [4]]
Ejemplo de uso con Python Embebido:
import iris
from iris_dollar_list import DollarList
gl = iris.gref("^list")
my_list = DollarList.from_bytes(gl[None].encode('ascii'))
print(my_list.to_list())
# ['test', [4]]
1.3. Funciones
1.3.1. append
Añade un elemento a la lista.
Este elemento puede ser:
- un string
- un int
- un DollarList
- un DollarItem
my_list = DollarList()
my_list.append("one")
my_list.append(1)
my_list.append(DollarList.from_list(["list",2]))
my_list.append(DollarItem(dollar_type=1, value="item",
raw_value=b"item",
buffer=b'\x06\x01item'))
print(DollarList.from_bytes(my_list.to_bytes()))
# $lb("one",1,$lb("list",2),"item")
1.3.2. from_bytes
Crea un DollarList desde bytes.
my_list = DollarList.from_bytes(b'\x05\x01one')
print(my_list)
# $lb("one")
1.3.3. from_list
Crea un DollarList desde una lista.
print(DollarList.from_list(["list",2]))
# $lb("list",2)
1.3.4. to_bytes
Convierte DollarList en bytes.
my_list = DollarList.from_list(["list",2])
print(my_list.to_bytes())
# b'\x06\x01list\x03\x04\x02'
1.3.5. to_list
Convierte DollarList en una lista.
my_list = DollarList.from_bytes(b'\x05\x01one')
print(my_list.to_list())
# ['one']
2. $list
2.1. ¿Qué es $list?
$list es formato binario para almacenar datos. Se usa en InterSystems IRIS. Es un formato que es fácil de leer y escribir. También es sencillo de analizar.
Lo genial de $list es que no está limitado por el almacenamiento. También se usa para comunicación en el puerto SuperServer de IRIS.
2.2. ¿Cómo funciona?
$list es un formato binario que almacenta una lista de valores. Cada valor se almacena en un bloque. Cada bloque está compuesto de un header y un body. El header se compone de un tamaño y un tipo. El body se compone del valor.
2.2.1. Header
El header o cabecera se compone de un tamaño y un tipo.
2.2.1.1. Size
El tamaño indica el tamaño del bloque. El tamaño se almacena en N
bytes.N
está determinado por el número de bytes que son cero en los primeros bytes del header.
El tamaño se almacena en little endian.
2.2.1.2. Type
El tipo es un byte que representa el tipo del valor.
El tipo se almacena justo después del tamaño.
Lista de tipos:
* ascii: 0x01
* unicode: 0x02
* int: 0x04
* negative int: 0x05
* float: 0x06
* negative float: 0x07
* double: 0x08
* compact double: 0x09
2.2.2. Body
El cuerpo se compone del valor.
Para analizar el cuerpo, hay que saber el tipo del valor.
2.2.2.1. Ascii
Descodifica el valor como ascii.
Si la descodificación falla, considera el valor como una sub-list.
Si descodificar la sub-lista falla, considera el valor como un binario.
2.2.2.2. Unicode
Descodifica el valor como unicode.
2.2.2.3. Int
Analiza el valor como un número entero en little endian y sin signo.
2.2.2.4. Negative Int
Analiza el valor como un número entero en little endian y con signo.