2323
2424import logging
2525from argparse import ArgumentParser
26+ from getpass import getpass
2627from json import loads as json_loads
2728from sys import stdout , stderr
2829
3536def main ():
3637 parser = ArgumentParser (description = "Execute one or more Cypher statements using Bolt." )
3738 parser .add_argument ("statement" , nargs = "+" )
38- parser .add_argument ("-i" , "--insecure" , action = "store_true" )
39- parser .add_argument ("-k" , "--keys" , action = "store_true" )
39+ parser .add_argument ("-H" , "--header" , action = "store_true" )
4040 parser .add_argument ("-P" , "--password" )
4141 parser .add_argument ("-p" , "--parameter" , action = "append" , metavar = "NAME=VALUE" )
4242 parser .add_argument ("-q" , "--quiet" , action = "store_true" )
43+ parser .add_argument ("-r" , "--read-only" , action = "store_true" )
44+ parser .add_argument ("-s" , "--secure" , action = "store_true" )
4345 parser .add_argument ("-U" , "--user" , default = "neo4j" )
44- parser .add_argument ("-u" , "--url " , default = "bolt://localhost:7687 " , metavar = "CONNECTION_URL " )
46+ parser .add_argument ("-u" , "--uri " , default = "bolt://" , metavar = "CONNECTION_URI " )
4547 parser .add_argument ("-v" , "--verbose" , action = "count" )
4648 parser .add_argument ("-x" , "--times" , type = int , default = 1 )
4749 parser .add_argument ("-z" , "--summary" , action = "store_true" )
@@ -62,28 +64,38 @@ def main():
6264 except ValueError :
6365 parameters [name ] = value
6466
65- driver = GraphDatabase .driver (args .url , auth = (args .user , args .password ), encrypted = not args .insecure )
66- session = driver .session ()
67- for _ in range (args .times ):
68- for statement in args .statement :
69- try :
70- result = session .run (statement , parameters )
71- except CypherError as error :
72- stderr .write ("%s: %s\r \n " % (error .code , error .message ))
73- else :
74- if not args .quiet :
75- if args .keys :
76- stdout .write ("%s\r \n " % "\t " .join (result .keys ()))
77- for i , record in enumerate (result ):
78- stdout .write ("%s\r \n " % "\t " .join (map (repr , record .values ())))
79- if args .summary :
80- summary = result .summary
81- stdout .write ("Statement : %r\r \n " % summary .statement )
82- stdout .write ("Parameters : %r\r \n " % summary .parameters )
83- stdout .write ("Statement Type : %r\r \n " % summary .statement_type )
84- stdout .write ("Counters : %r\r \n " % summary .counters )
85- stdout .write ("\r \n " )
86- session .close ()
67+ try :
68+ password = args .password or getpass ()
69+ except KeyboardInterrupt :
70+ exit (0 )
71+ else :
72+ with GraphDatabase .driver (args .uri , auth = (args .user , password ), encrypted = args .secure ) as driver :
73+ with driver .session () as session :
74+
75+ run = session .read_transaction if args .read_only else session .write_transaction
76+
77+ for _ in range (args .times ):
78+ for statement in args .statement :
79+
80+ def work (tx , p ):
81+ result = tx .run (statement , p )
82+ if not args .quiet :
83+ if args .header :
84+ stdout .write ("%s\r \n " % "\t " .join (result .keys ()))
85+ for i , record in enumerate (result ):
86+ stdout .write ("%s\r \n " % "\t " .join (map (repr , record .values ())))
87+ if args .summary :
88+ summary = result .summary ()
89+ stdout .write ("Statement : %r\r \n " % summary .statement )
90+ stdout .write ("Parameters : %r\r \n " % summary .parameters )
91+ stdout .write ("Statement Type : %r\r \n " % summary .statement_type )
92+ stdout .write ("Counters : %r\r \n " % summary .counters )
93+ stdout .write ("\r \n " )
94+
95+ try :
96+ run (work , parameters )
97+ except CypherError as error :
98+ stderr .write ("%s: %s\r \n " % (error .code , error .message ))
8799
88100
89101if __name__ == "__main__" :
0 commit comments