Files
secondo/apis/python2/SecondoAPI/.ipynb_checkpoints/command_handler-checkpoint.ipynb

294 lines
11 KiB
Plaintext
Raw Normal View History

2026-01-23 17:03:45 +08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Command format: restore [database] database_name from <filename> \n",
"async def restore_command(reader, writer, bin_list, command):\n",
" \n",
" if reader and writer:\n",
" if not command.startswith('(') :\n",
" command = '(' + command.strip() + ')'\n",
" \n",
" CmdNL = NLparse(command, False)\n",
" print(CmdNL)\n",
" length = len(CmdNL)\n",
" if length != 4 and length != 5:\n",
" print(\"restore_command(): command lenght wrong!\") \n",
" return None\n",
" if length == 5: #restore database\n",
" if CmdNL[0] != 'restore' or CmdNL[1] != 'database' or CmdNL[3] != 'from':\n",
" print(\"restore_command: command wrong\") \n",
" return None\n",
" name = CmdNL[2]\n",
" filename = CmdNL[4]\n",
" database = True\n",
" if length == 4:\n",
" if CmdNL[0] != 'restore' or CmdNL[2] != 'from':\n",
" print(\"restore_command: command wrong\") \n",
" return None\n",
" name = CmdNL[1]\n",
" filename = CmdNL[3]\n",
" database = False\n",
" \n",
" typ = AtomType(filename)\n",
" if not typ in (\"string\", \"symbol\", \"text\"):\n",
" print(\"restore_command: filename wrong\") \n",
" return None\n",
" \n",
" \n",
" tag = \"DbRestore\" if database else \"ObjectRestore\"\n",
" message = \"<\" + tag + \">\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" \n",
"\n",
" message = name + \"\\n\"\n",
" print(\"name:\")\n",
" print(name)\n",
" message = message.encode()\n",
" writer.write(message)\n",
" \n",
" \n",
" message = \"<FileData>\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" \n",
" with open(filename, \"rb\") as f:\n",
" #with open(filename, \"rb\", encoding=\"utf8\", errors='ignore') as f: \n",
" byte = f.read(1)\n",
" size = 0\n",
" while byte:\n",
" size += 1\n",
" byte = f.read(1)\n",
" print(str(size)) \n",
" \n",
" \n",
" #flen1 = os.path.getsize(f.name)\n",
" #flen = len(file)\n",
" message = str(size) + \"\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" await writer.drain()\n",
" \n",
" \n",
" #reading contents of file via io.stream\n",
" stream = open(filename, 'rb')\n",
" message = stream.read()\n",
" stream.close()\n",
" writer.write(message)\n",
" \n",
" #with open(filename, \"rb\") as f:\n",
" #, encoding=\"utf8\", errors='ignore'\n",
" #message = f.read()\n",
" #writer.write(message)\n",
" \n",
" message = \"</FileData>\\n\"\n",
" message = message.encode()\n",
" #print(message)\n",
" writer.write(message)\n",
" \n",
" message = \"</\" + tag + \">\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" await writer.drain()\n",
" #print(message)\n",
" \n",
" #### secondoresponse- ReceiveResponse\n",
" print(\"calling Receive_Response()\")\n",
" resp = await Receive_Response(reader, bin_list)\n",
" #print(resp)\n",
" if resp[0] == 0:\n",
" print('restore was seccessful!')\n",
" else:\n",
" print('Error occured during restore!')\n",
" \n",
" return resp\n",
" \n",
" else:\n",
" print(\"reader and writer Sockets null\")\n",
" return None\n",
" \n",
" \n",
"\n",
"#Command format: save database/<object_name> to <filename> \n",
"async def save_command(reader, writer, bin_list, command):\n",
" \n",
" if reader and writer:\n",
" if not command.startswith('(') :\n",
" command = '(' + command.strip() + ')'\n",
" \n",
" CmdNL = NLparse(command, False)\n",
" print(CmdNL)\n",
" \n",
" \n",
" if CmdNL[0] != 'save' or CmdNL[2] != 'to':\n",
" print(\"save_command: command wrong\") \n",
" return None\n",
" obj_name = CmdNL[1]\n",
" filename = CmdNL[3]\n",
" \n",
" typ = AtomType(filename)\n",
" if not typ in (\"string\", \"symbol\", \"text\"):\n",
" print(\"save_command: filename wrong\") \n",
" return None\n",
" \n",
" if obj_name == \"database\":\n",
" writer.write(\"<DbSave/>\\n\".encode())\n",
" else:\n",
" writer.write(\"<ObjectSave>\\n\".encode())\n",
" writer.write((obj_name + \"\\n\").encode())\n",
" writer.write(\"</ObjectSave>\\n\".encode())\n",
" \n",
" await writer.drain()\n",
" resp = await Receive_Response(reader, bin_list)\n",
" if resp:\n",
" if resp[0] == 0:\n",
" stream = open(filename, 'w')\n",
" stream.writelines(resp[3])\n",
" stream.close()\n",
" print('Save Successful!')\n",
" return resp\n",
" else:\n",
" return None\n",
" else:\n",
" print(\"reader and writer Sockets null\")\n",
" return None\n",
"\n",
"\n",
"async def general_command(reader, writer, bin_list, command):\n",
" \n",
" if reader and writer:\n",
" \n",
" if 'pysend[' in command.lower():\n",
" \n",
" async def handle_RecFromSec(reader, writer):\n",
" \n",
" list = os.listdir(os.getcwd() + '/tmp')\n",
" \n",
" try:\n",
" f = open('tmp/send' + str(len(list) + 1), 'w')\n",
" count = 0\n",
" while True:\n",
" line = await reader.readline()\n",
" f.write(line.decode())\n",
" \n",
" #line = base64.b64decode(line)\n",
" #f.write(base64.b64decode(line) + '\\n')\n",
" \n",
" count +=1\n",
" if 'quit' in line.decode():\n",
" break\n",
" except IOError:\n",
" print(\"Error writing to file!\")\n",
" finally:\n",
" f.close()\n",
" \n",
" print('Stream of {} Tuples received from SecondoServer.'.format(str(count)))\n",
" \n",
" \n",
" idx1 = command.find('pysend[') + 7\n",
" idx2 = command.find(']', int(idx1))\n",
" port = int(command[idx1:idx2])\n",
" print('port:')\n",
" print(port)\n",
" loop = asyncio.get_event_loop()\n",
" loop.create_task(asyncio.start_server(handle_RecFromSec, '127.0.0.1', port))\n",
" #server = loop.create_task(asyncio.start_server(handle_RecFromSec, '127.0.0.1', port))\n",
" #server.close()\n",
" #loop.run_until_complete(server.wait_closed())\n",
" \n",
" if 'pyreceive[' in command.lower():\n",
" \n",
" async def handle_send2Sec(reader, writer):\n",
" #try:\n",
" #file = input(\"Enter the file name containing the tuples:\\n\")\n",
" #except EOFError as e:\n",
" #print(\"Error getting the file name!\")\n",
" \n",
" try:\n",
" f = open('tmp/send19', 'r')\n",
" lines = f.readlines()\n",
" except IOError:\n",
" print(\"No such file!\")\n",
" finally:\n",
" f.close()\n",
" \n",
" count = 0\n",
" for line in lines:\n",
" if not line.startswith('(stream') and not line.startswith('quit'):\n",
" print (line)\n",
" writer.write(line.encode())\n",
" await writer.drain()\n",
" count +=1\n",
" \n",
" print('Stream of {} Tuples sent to SecondoServer.'.format(str(count)))\n",
" writer.close()\n",
" \n",
" idx1 = command.find('pyreceive[') + 10\n",
" idx2 = command.find(']', int(idx1))\n",
" port = int(command[idx1:idx2])\n",
" loop = asyncio.get_event_loop()\n",
" loop.create_task(asyncio.start_server(handle_send2Sec, '127.0.0.1', port))\n",
" #server = loop.create_task(asyncio.start_server(handle_send2Sec, '127.0.0.1', port))\n",
" #server.close()\n",
" #loop.run_until_complete(server.wait_closed())\n",
" \n",
" cmdLevel = str(0 if ((command.lstrip()).lower()).startswith('(') else 1)\n",
" \n",
" message = \"<Secondo>\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" \n",
" cmdLevel += \"\\n\"\n",
" message = cmdLevel.encode()\n",
" writer.write(message)\n",
" \n",
" message = command\n",
" message = message.encode()\n",
" writer.write(message)\n",
"\n",
" message = \"\\n</Secondo>\\n\"\n",
" message = message.encode()\n",
" writer.write(message)\n",
" await writer.drain()\n",
" \n",
" print(\"in general_command writing finished, if Pysend and receive start server, run Receive_Response(sec)\")\n",
" result = await Receive_Response(reader, bin_list)\n",
" print(\"in general_command writing finished Receive_Response(sec)\")\n",
" return result\n",
" else:\n",
" print(\"reader and writer Sockets null\")\n",
" return None\n",
" \n",
" \n",
" \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
}