Blog

Noticias

Lanzamiento de pl/dotnet, versión 0.99 (beta)

pl/dotnet añade a PostgreSQL soporte completo para C# y F#. La 0.99 es nuestra versión beta pública. Deseamos compartir con el mundo sus increíbles características.

  • Soportamos todas las operaciones PL: funciones, procedimientos, DO, SPI, triggers, registros, SRF, OUT/INOUT, funciones de tabla, etc
  • Soportamos de forma nativa 40 de los 46 tipos de usuario estándar, la mayor cantidad entre todos los PL externos.
  • Compatibilidad completa con NPGSQL. La SPI se expone a través de la API NPGSQL para garantizar la máxima compatibilidad.
  • En nuestros benchmarks, C# y F# resultan ser los lenguajes procedurales más rápidos en PostgreSQL
  • Todas las funciones han sido completamente probadas tanto en C# como en F#, con 1013 pruebas unitarias.
  • 100% software libre bajo licencia PostgreSQL

Esta es una versión beta. Les invitamos a utilizarla y agradeceríamos sus comentarios. 

Para acceder a ella:

Más detalles a continuación.

Ejemplo de uso

pl/dotnet proporciona toda la potencia de C# y F# para procedimientos, funciones y triggers PostgreSQL.

CREATE OR REPLACE FUNCTION dynamic_record_generator_srf(lim INT8)
RETURNS SETOF record
AS $$
    upperLimit = lim.HasValue ? lim : System.Int32.MaxValue;
    for(long i=0;i<upperLimit;i++){ yield return new object?[] { i, $"Number is {i}" }; }
$$ LANGUAGE plcsharp;

CREATE OR REPLACE FUNCTION dynamic_record_generator_srf_fsharp(lim INT8)
RETURNS SETOF record
AS $$
    let upperLimit = Option.defaultValue (int64 System.Int32.MaxValue) lim
    seq { for i in 0L .. upperLimit - 1L do yield [| box i; $"Number is {i}" |] }
$$ LANGUAGE plfsharp;

Funciones SQL

Soportamos todos los modos de función SQL:

  • procedimientos y funciones normales
  • funciones de trigger, con soporte completo para trigger: argumentos de trigger, registro antiguo/nuevo, reescritura de registros (cuando esté permitido), y toda la información estándar de trigger
  • funciones que devuelven conjuntos, perfectamente adaptadas a los iteradores en C# y a las secuencias en F#
  • funciones de tabla, así como funciones que devuelven registros o conjuntos de registros
  • soporte completo de las funciones IN/OUT/INOUT

Soporte de tipos de datos

Soportamos 40 tipos de PostgreSQL, todos mapeados a sus respectivos tipos dotnet estándar de NPGSQL. Las únicas excepciones destacables son los tipos multirango, enum y struct, que esperamos añadir en el futuro. Todos los tipos de datos aceptan valores NULL, ofrecen soporte completo para arrays y están totalmente probados para C# y F#. (Formateados como una lista de (tipo PostgreSQL: tipo Dotnet) en lugar de una tabla por razones técnicas).

  • bit: BitArray
  • bool: Bool
  • box: NpgsqlBox
  • bpchar: String
  • bytea: Byte[]
  • cidr: (IPAddress Address, Int Netmask)
  • circle: NpgsqlCircle
  • date: DateOnly
  • daterange: NpgsqlRange<DateOnly>
  • float4: Float
  • float8: Double
  • inet: (IPAddress Address, Int Netmask)
  • int2: Short
  • int4: Int
  • int4range: NpgsqlRange<Int>
  • int8: Long
  • int8range: NpgsqlRange<Long>
  • interval: NpgsqlInterval
  • json: String
  • line: NpgsqlLine
  • lseg: NpgsqlLSeg
  • macaddr8: PhysicalAddress
  • macaddr: PhysicalAddress
  • money: Decimal
  • path: NpgsqlPath
  • point: NpgsqlPoint
  • polygon: NpgsqlPolygon
  • record: Object?[]
  • text: String
  • timestamp: DateTime
  • timestamptz: DateTime
  • time: TimeOnly
  • timetz: DateTimeOffset
  • tsrange: NpgsqlRange<DateTime>
  • tstzrange: NpgsqlRange<DateTime>
  • uuid: Guid
  • varbit: BitArray
  • varchar: String
  • void: Void
  • xml: String

SPI

Nuestra SPI aprovecha la biblioteca de cliente NPGSQL para proporcionar una implementación dotnet nativa que sea lo más compatible posible con el código de cliente existente. Interceptamos las llamadas NPGSQL a un nivel muy bajo para sustituir el manejo del protocolo cliente por llamadas SPI. Aparte de eso, NPGSQL no se modificó. Hemos importado el conjunto de pruebas NPGSQL como procedimientos almacenados y lo estamos utilizando para nuestras pruebas, lo cual nos permite comprender muy bien nuestro nivel de compatibilidad.

Queda trabajo por hacer para mejorar la compatibilidad y añadir funciones. Nuestra principal categoría de pruebas NPGSQL que siguen fallando es el mapeo de errores, debido a que SPI lanza excepciones de forma diferente a como lo hace NPGSQL. Estas incompatibilidades aunque menores son numerosas; por lo que seguimos trabajando para mejorarlas.

Éstas son nuestras operaciones SPI que ya hemos probado:

  • Operaciones Data Manipulation Language (DML)
    • Select
    • Insert
    • Update
    • Delete
  • Operaciones Data Definition Language (DDL)
    • Create Table
    • Alter Table
    • Drop Table
    • Truncate
    • Create Index
    • Drop Index
    • Create View
    • Drop View
    • Create Function
    • Call Function
    • Drop Function
    • Create Procedure
    • Call Procedure
    • Drop Procedure
  • Control de transacciones
    • Begin Transaction
    • Commit
    • Rollback
  • Tipos de datos soportados: todos los tipos pl/dotnet
    • Tipos básicos (incluidos los rangos)
    • Tipos de array
    • Record

Qué nos falta

Nos falta soporte para los tipos multirango, enum y compuesto/tabla. Queremos añadirlos.

Nuestra implementación de la SPI carece de algunas características menores como las subtransacciones, y a veces generamos errores de una forma diferente (y por tanto levemente incompatible) con NPGSQL.

Nuestro sistema de compilación, con salida dpkg y binaria, es funcional pero no tan ordenado como nos gustaría.

Agradecemos el envío de código para solucionar cualquiera de estos problemas, y esperamos mejorarlos todos con el tiempo.

Cómo obtenerla

Nuestro sistema operativo soporta:

  • Somos totalmente compatibles con Linux y proporcionamos dpkgs para Debian y Ubuntu. (Más información en nuestra página de instalación)
  • Hemos compilado y probado el sistema en OSX (arm y x86), aunque aún no lo hemos empaquetado.
  • Esperamos tener pronto soporte para Windows; envíennos un ping si desean ayudarnos.

Contáctennos

Agradeceríamos cualquier comentario de la comunidad. Pueden contactarnos en nuestro foro de discusión de GitHub o enviarnos un correo electrónico a pldotnet@brickabode.com.

Haz clic aquí para leer la noticia original en inglés en la página web oficial de PostgreSQL.