Files
secondo/apis/python2/SecondoAPI/libs_pkg/write_binary_format.ipynb
2026-01-23 17:03:45 +08:00

294 lines
12 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#returns the type of the given item of NestedList\n",
"from struct import *\n",
"import asyncio\n",
"import nest_asyncio\n",
"nest_asyncio.apply()\n",
"import import_ipynb\n",
"\n",
"from libs_pkg.nested_list import *\n",
"from libs_pkg.exception_handler import *\n",
" \n",
"def binary_type(item):\n",
" \"\"\"\n",
" The function binary_type() returns the aquivalent binary type of the item in a \n",
" nested list according to the data types of the nested lists in Secondo.\n",
" :param item: An element in nested list.\n",
" :return: The binary data type.\n",
" \"\"\"\n",
" itemType = item_type(item)\n",
" if itemType == \"string\":\n",
" length = len(item)\n",
" if length < 256:\n",
" return 'BIN_SHORTSTRING'\n",
" if length < 65536:\n",
" return 'BIN_STRING'\n",
" return 'BIN_LONGSTRING'\n",
" if itemType == \"symbol\":\n",
" length = len(item)\n",
" if length < 256:\n",
" return 'BIN_SHORTSYMBOL'\n",
" if length < 65536:\n",
" return 'BIN_SYMBOL'\n",
" return 'BIN_LONGSYMBOL'\n",
" if itemType == \"integer\":\n",
" if item in range(-128, 128):\n",
" return 'BIN_BYTE'\n",
" if item in range(-32768, 32768):\n",
" return 'BIN_SHORTINT'\n",
" return 'BIN_INTEGER'\n",
" if itemType == \"real\":\n",
" return 'BIN_DOUBLE'\n",
" if itemType == \"boolean\":\n",
" return 'BIN_BOOLEAN'\n",
" if itemType == \"text\":\n",
" length = len(item)\n",
" if length < 256:\n",
" return 'BIN_SHORTTEXT'\n",
" if length < 65536:\n",
" return 'BIN_TEXT'\n",
" return 'BIN_LONGTEXT'\n",
" if itemType == \"list\":\n",
" length = len(item)\n",
" if length < 256:\n",
" return 'BIN_SHORTLIST'\n",
" if length < 65536:\n",
" return 'BIN_LIST'\n",
" return 'BIN_LONGLIST'\n",
" \n",
" #main function \n",
"async def write_binary_header(writer, NL):\n",
" \"\"\"\n",
" The function write_binary_header() writes the binary header which contains\n",
" signature and version to the stream writer of Secondo object which is \n",
" connected to Secondo server and converts each element of the nested list\n",
" to binary format by calling the function binary_encode().\n",
" \n",
" :param writer: Stream writer of the Secondo object.\n",
" :param NL: The nested list to be converted.\n",
" :return: True if the conversion is succesful Flase when not.\n",
" \"\"\"\n",
" \n",
" if not writer:\n",
" writer.close()\n",
" raise SecondoAPI_ERROR('Connection to secondo reset.')\n",
" \n",
" sig = bytearray(\"bnl\")\n",
" major = pack('>H', 1)\n",
" minor = pack('>H', 2)\n",
" writer.write(sig)\n",
" writer.write(major)\n",
" writer.write(minor)\n",
" await writer.drain()\n",
" ok = await binary_encode(writer, NL)\n",
" await writer.drain()\n",
" return ok\n",
" \n",
" \n",
"async def binary_encode(writer, NL):\n",
" \"\"\"\n",
" The function binary_encode() converts each element of the nested list\n",
" to binary format and writes them to the stream writer of Secondo object \n",
" which is connected to Secondo server.\n",
" \n",
" :param writer: Stream writer of the Secondo object.\n",
" :param NL: The nested list to be converted.\n",
" :return: True if the conversion is succesful and Flase when not.\n",
" \"\"\"\n",
" \n",
" if not writer:\n",
" writer.close()\n",
" raise SecondoAPI_ERROR('Connection to secondo reset.')\n",
" \n",
" Type_dict = {\"BIN_LONGLIST\": 0,\n",
" \"BIN_INTEGER\": 1,\n",
" \"BIN_REAL\": 2,\n",
" \"BIN_BOOLEAN\": 3,\n",
" \"BIN_LONGSTRING\": 4,\n",
" \"BIN_LONGSYMBOL\": 5,\n",
" \"BIN_LONGTEXT\": 6,\n",
" \"BIN_LIST\": 10,\n",
" \"BIN_SHORTLIST\": 11,\n",
" \"BIN_SHORTINT\": 12,\n",
" \"BIN_BYTE\":13,\n",
" \"BIN_STRING\": 14,\n",
" \"BIN_SHORTSTRING\": 15,\n",
" \"BIN_SYMBOL\": 16,\n",
" \"BIN_SHORTSYMBOL\": 17,\n",
" \"BIN_TEXT\": 18,\n",
" \"BIN_SHORTTEXT\": 19,\n",
" \"BIN_DOUBLE\": 20}\n",
" for item in NL:\n",
" btype = binary_type(item)\n",
" typeCode = None\n",
" for typ, val in Type_dict.items():\n",
" if btype == typ:\n",
" typeCode = val\n",
" break\n",
" \n",
" if btype == 'BIN_BOOLEAN':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" val = 1 if item else 0\n",
" writer.write(pack('?', val)[0])\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_INTEGER':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>I', item))\n",
" await writer.drain()\n",
" return True\n",
" if btype == 'BIN_SHORTINT':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>H', item))\n",
" await writer.drain()\n",
" return True\n",
" if btype == 'BIN_BYTE':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(item.to_bytes(1, byteorder='big'))\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_REAL':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>f', item)[0])\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_DOUBLE':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>d', item)[0])\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_DOUBLE':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>d', item)[0])\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_SHORTSTRING':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(len(item).to_bytes(1, byteorder='big'))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_STRING':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>H', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_LONGSTRING':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>I', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_SHORTSYMBOL':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(len(item).to_bytes(1, byteorder='big'))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_SYMBOL':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>H', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_LONGSYMBOL':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>I', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_SHORTTEXT':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(len(item).to_bytes(1, byteorder='big'))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_TEXT':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>H', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_LONGTEXT':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>I', len(item)))\n",
" writer.write(item.encode())\n",
" await writer.drain()\n",
" return True\n",
"\n",
" if btype == 'BIN_SHORTLIST':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(len(item).to_bytes(1, byteorder='big'))\n",
" for i in range(len(item)):\n",
" res = await binary_encode(writer, item[i])\n",
" if not res:\n",
" return False\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_LIST':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>H', len(item)))\n",
" for i in range(len(item)):\n",
" res = await binary_encode(writer, item[i])\n",
" if not res:\n",
" return False\n",
" await writer.drain()\n",
" return True\n",
" \n",
" if btype == 'BIN_LONGLIST':\n",
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
" writer.write(pack('>I', len(item)))\n",
" for i in range(len(item)):\n",
" res = await binary_encode(writer, item[i])\n",
" if not res:\n",
" return False\n",
" await writer.drain()\n",
" return True\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}