Skip to content

Commit

Permalink
Merge pull request #25 from atf1206/minor_send_update
Browse files Browse the repository at this point in the history
Cleanup send, expand error handling
  • Loading branch information
komsit37 committed Jun 14, 2020
2 parents dfa63a7 + d562a17 commit a3be63c
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 72 deletions.
39 changes: 21 additions & 18 deletions QCon.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sublime, sublime_plugin
from .qpython import qconnection
from .qpython.qtype import QException
from socket import error as socket_error
from . import util

Expand Down Expand Up @@ -45,12 +46,12 @@ def loadFromViewWithPrompt(cls, view):
#return QCon.fromDict(d)
con = QCon.fromDict(d)
if con:
return con
return con
else:
#connect first
#sublime.message_dialog('Sublime-q: Choose your q connection first!')
view.window().run_command('q_show_connection_list')
return None
#connect first
#sublime.message_dialog('Sublime-q: Choose your q connection first!')
view.window().run_command('q_show_connection_list')
return None

@classmethod
def fromDict(cls, d):
Expand Down Expand Up @@ -117,11 +118,14 @@ def useHdb(self, hdb):

def status(self):
status = 'OK' if self.checkOk() else 'FAIL'
name = (self.name) if self.name else ''
hdb = (' (HDB)') if self.hdb else ''
if self.mem:
mem = ' [' + util.format_mem(int(self.mem)) + ']'
else:
name = self.name if self.name else ''
hdb = ' (HDB)' if self.hdb else ''
try:
if self.mem:
mem = ' [' + util.format_mem(int(self.mem)) + ']'
else:
mem = ''
except:
mem = ''


Expand All @@ -131,16 +135,15 @@ def checkOk(self):
try:
self.q.open()
if not self.init:
#only call at first time
print('init ' + self.h())
#self.q('system "c 2000 2000"') #expand output to max 2000 chars
self.init = True
self.mem = self.q('@[{.Q.w[][`used]}; (); 0]')
#only call at first time
print('init ' + self.h())
#self.q('system "c 2000 2000"') #expand output to max 2000 chars
self.init = True
self.mem = self.q('@[{.Q.w[][`used]};();0]')
except QException as e:
return False
except socket_error as serr:
return False
finally:
self.q.close()
return True



127 changes: 73 additions & 54 deletions q_send.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,64 +26,85 @@ def do(self, edit=None, input=None):

#keep this because it is overwritten in QUpdateCompletionsCommand
def send(self, con, input):
return QSendRawCommand.sendAndUpdateStatus(self.view, con, input)
return QSendRawCommand.sendAndUpdateStatus(self.view, con, input)

@staticmethod
def sendAndUpdateStatus(view, con, input):
view.set_status('result', 'executing...')
try:
d = QSendRawCommand.executeRaw(con, input)
view.set_status('result', d['status'])
view.set_status('q', con.status())
return d['result']
except Exception as e:
sublime.error_message('Error in QSendRawCommand.sendAndUpdateStatus:\n' + str(e))
view.set_status('result', 'ERROR')
view.set_status('q', con.status())
raise e
view.set_status('result', 'executing...')
try:
d = QSendRawCommand.executeRaw(con, input)
view.set_status('result', d['status'])
view.set_status('q', con.status())
return d['result']
except Exception as e:
sublime.error_message('Error in QSendRawCommand.sendAndUpdateStatus:\n' + str(e))
view.set_status('result', 'ERROR')
view.set_status('q', con.status())
raise e

@staticmethod
def executeRaw(con, input):
try:
q = con.q
q.open()

start_time = datetime.datetime.now()

write_flag = q('@[{`.st.tmp set x;1b};();0b]')
input = input[:5] + ('.st.tmp:' + input[5:] if write_flag else input[5:])

mem = '@[{.Q.w[][`used]};();0]'
dims = '$[@[{`tmp in key x};`.st;0b];" x " sv string (count @[{$[0<=type x; cols x;()]};.st.tmp;()]),count .st.tmp;0]'
res = q('(' + ';'.join([dims, mem, input, mem]) + ')')

end_time = datetime.datetime.now()
time = str(end_time - start_time)[2:-3]

count, mem, res = [util.decode(x) for x in [res[0], res[1] - res[3], res[2]]]
mem = int(mem)
sign = '+' if mem>0 else '-'
mem = util.format_mem(abs(mem))

#return input itself if query is define variable or function (and return no result)
if res is None:
res = input

status = 'Result: ' + count + ', ' + time + ', ' + sign + mem
#self.view.set_status('result', 'Result: ' + count + ', ' + time + ', ' + sign + mem)
except QException as e:
res = "error: `" + util.decode(e)
status = "error: `" + util.decode(e)
except socket_error as serr:
msg = 'Sublime-q cannot to connect to \n"' + con.h() + '"\n\nError message: ' + str(serr)
sublime.error_message(msg)
res = ""
status = "error: " + str(serr)
finally:
q.close()

#self.view.set_status('q', con.status())
return {'result': res, 'status': status}
try:
q = con.q
q.open()

input_prefix = input[:5] # probably .Q.s or .j.j -- make more generic later if necessary
input_body = input[5:]

mem_query = '@[{.Q.w[][`used]};();0]'
write_query = '@[{`.st.tmp set x;`sublimeq};();0b]'
initial_query = '(' + mem_query + ';' + write_query + ')'

pre_res = q(initial_query)

try:
write_flag = util.decode(pre_res[1]) == 'sublimeq'
start_mem = int(util.decode(pre_res[0]))
except:
write_flag = False
start_mem = 0

input = input_prefix + ('.st.tmp:' if write_flag else '') + input_body

start_time = datetime.datetime.now()
res = util.decode(q(input))
end_time = datetime.datetime.now()
time = str(end_time - start_time)[2:-3]

dims_query = '$[@[{`tmp in key x};`.st;0b];" x " sv string (count @[{$[0<=type x; cols x;()]};.st.tmp;()]),count .st.tmp;0]'
post_query = '(' + mem_query + ';' + dims_query + ')'
post_res = q(post_query)

try:
end_mem = int(util.decode(post_res[0]))
mem = end_mem - start_mem
sign = '+' if mem>0 else '-'
mem = util.format_mem(abs(mem))
dims = util.decode(post_res[1])
except:
sign = ''
mem = '0'
dims = '0'

# Return input itself if no results return (e.g. a query that defines a variable or function)
# if res in [None, 'None']:
# res = input_body

status = 'Result: ' + dims + ', ' + time + ', ' + sign + mem
#self.view.set_status('result', 'Result: ' + count + ', ' + time + ', ' + sign + mem)
except QException as e:
res = "error: `" + util.decode(e)
status = "error: `" + util.decode(e)
except socket_error as serr:
msg = 'Sublime-q cannot to connect to \n"' + con.h() + '"\n\nError message: ' + str(serr)
sublime.error_message(msg)
res = ""
status = "error: " + str(serr)
finally:
q.close()

#self.view.set_status('q', con.status())
return {'result': res, 'status': status}

class QSendCommand(QSendRawCommand):
def do(self, edit=None, input=None):
Expand All @@ -100,5 +121,3 @@ def do(self, edit=None, input=None):

input = ".j.j " + input #save to temprary result, so we can get dimension later
return super().do(input=input)


0 comments on commit a3be63c

Please sign in to comment.