Artículo
Guillaume Rongier · Nov 28, 2022 Lectura de 4 min

Otra Implementación de $lb() // iris-dollar-list

1. iris-dollar-list

PyPI - Status
PyPI
GitHub
Coverage

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.

0
0 15
Debate (0)1
Inicie sesión o regístrese para continuar