# HG changeset patch # User Sylvain Thénault # Date 1265368612 -3600 # Node ID 14429e8c7590e4e55ad70498cbdc32866ef85eb9 # Parent 37c413a07216221d916ac76bbc1f09a76d992de9 hercule (aka c-c client command) have not (ever?) been used for years, stop supporting it diff -r 37c413a07216 -r 14429e8c7590 cwconfig.py --- a/cwconfig.py Fri Feb 05 12:14:36 2010 +0100 +++ b/cwconfig.py Fri Feb 05 12:16:52 2010 +0100 @@ -479,7 +479,7 @@ from logilab.common.modutils import load_module_from_file cls.cls_adjust_sys_path() for ctlfile in ('web/webctl.py', 'etwist/twctl.py', - 'server/serverctl.py', 'hercule.py', + 'server/serverctl.py', 'devtools/devctl.py', 'goa/goactl.py'): if exists(join(CW_SOFTWARE_ROOT, ctlfile)): try: diff -r 37c413a07216 -r 14429e8c7590 hercule.py --- a/hercule.py Fri Feb 05 12:14:36 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,276 +0,0 @@ -"""RQL client for cubicweb, connecting to instance using pyro - -:organization: Logilab -:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. -:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr -:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses -""" -__docformat__ = "restructuredtext en" - -import os -import sys - -from logilab.common import flatten -from logilab.common.cli import CLIHelper -from logilab.common.clcommands import BadCommandUsage, pop_arg, register_commands -from cubicweb.toolsutils import CONNECT_OPTIONS, Command - -# result formatter ############################################################ - -PAGER = os.environ.get('PAGER', 'less') - -def pager_format_results(writer, layout): - """pipe results to a pager like more or less""" - (r, w) = os.pipe() - pid = os.fork() - if pid == 0: - os.dup2(r, 0) - os.close(r) - os.close(w) - if PAGER == 'less': - os.execlp(PAGER, PAGER, '-r') - else: - os.execlp(PAGER, PAGER) - sys.exit(0) - stream = os.fdopen(w, "w") - os.close(r) - try: - format_results(writer, layout, stream) - finally: - stream.close() - os.waitpid(pid, 0) - -def izip2(list1, list2): - for i in xrange(len(list1)): - yield list1[i] + tuple(list2[i]) - -def format_results(writer, layout, stream=sys.stdout): - """format result as text into the given file like object""" - writer.format(layout, stream) - - -try: - encoding = sys.stdout.encoding -except AttributeError: # python < 2.3 - encoding = 'UTF-8' - -def to_string(value, encoding=encoding): - """used to converte arbitrary values to encoded string""" - if isinstance(value, unicode): - return value.encode(encoding, 'replace') - return str(value) - -# command line querier ######################################################## - -class RQLCli(CLIHelper): - """Interactive command line client for CubicWeb, allowing user to execute - arbitrary RQL queries and to fetch schema information - """ - # commands are prefixed by ":" - CMD_PREFIX = ':' - # map commands to folders - CLIHelper.CMD_MAP.update({ - 'connect' : "CubicWeb", - 'schema' : "CubicWeb", - 'description' : "CubicWeb", - 'commit' : "CubicWeb", - 'rollback' : "CubicWeb", - 'autocommit' : "Others", - 'debug' : "Others", - }) - - def __init__(self, instance=None, user=None, password=None, - host=None, debug=0): - CLIHelper.__init__(self, os.path.join(os.environ["HOME"], ".erqlhist")) - self.cnx = None - self.cursor = None - # XXX give a Request like object, not None - from cubicweb.schemaviewer import SchemaViewer - self.schema_viewer = SchemaViewer(None, encoding=encoding) - from logilab.common.ureports import TextWriter - self.writer = TextWriter() - self.autocommit = False - self._last_result = None - self._previous_lines = [] - if instance is not None: - self.do_connect(instance, user, password, host) - self.do_debug(debug) - - def do_connect(self, instance, user=None, password=None, host=None): - """connect to an cubicweb instance""" - from cubicweb.dbapi import connect - if user is None: - user = raw_input('login: ') - if password is None: - from getpass import getpass - password = getpass('password: ') - if self.cnx is not None: - self.cnx.close() - self.cnx = connect(login=user, password=password, host=host, - database=instance) - self.schema = self.cnx.get_schema() - self.cursor = self.cnx.cursor() - # add entities types to the completion commands - self._completer.list = (self.commands.keys() + - self.schema.entities() + ['Any']) - print _('You are now connected to %s') % instance - - - help_do_connect = ('connect', "connect [ [ []]]", - _(do_connect.__doc__)) - - def do_debug(self, debug=1): - """set debug level""" - self._debug = debug - if debug: - self._format = format_results - else: - self._format = pager_format_results - if self._debug: - print _('Debug level set to %s'%debug) - - help_do_debug = ('debug', "debug [debug_level]", _(do_debug.__doc__)) - - def do_description(self): - """display the description of the latest result""" - if self.rset.description is None: - print _('No query has been executed') - else: - print '\n'.join([', '.join(line_desc) - for line_desc in self.rset.description]) - - help_do_description = ('description', "description", _(do_description.__doc__)) - - def do_schema(self, name=None): - """display information about the instance schema """ - if self.cnx is None: - print _('You are not connected to an instance !') - return - done = None - if name is None: - # display the full schema - self.display_schema(self.schema) - done = 1 - else: - if self.schema.has_entity(name): - self.display_schema(self.schema.eschema(name)) - done = 1 - if self.schema.has_relation(name): - self.display_schema(self.schema.rschema(name)) - done = 1 - if done is None: - print _('Unable to find anything named "%s" in the schema !') % name - - help_do_schema = ('schema', "schema [keyword]", _(do_schema.__doc__)) - - - def do_commit(self): - """commit the current transaction""" - self.cnx.commit() - - help_do_commit = ('commit', "commit", _(do_commit.__doc__)) - - def do_rollback(self): - """rollback the current transaction""" - self.cnx.rollback() - - help_do_rollback = ('rollback', "rollback", _(do_rollback.__doc__)) - - def do_autocommit(self): - """toggle autocommit mode""" - self.autocommit = not self.autocommit - - help_do_autocommit = ('autocommit', "autocommit", _(do_autocommit.__doc__)) - - - def handle_line(self, stripped_line): - """handle non command line : - if the query is complete, executes it and displays results (if any) - else, stores the query line and waits for the suite - """ - if self.cnx is None: - print _('You are not connected to an instance !') - return - # append line to buffer - self._previous_lines.append(stripped_line) - # query are ended by a ';' - if stripped_line[-1] != ';': - return - # extract query from the buffer and flush it - query = '\n'.join(self._previous_lines) - self._previous_lines = [] - # search results - try: - self.rset = rset = self.cursor.execute(query) - except: - if self.autocommit: - self.cnx.rollback() - raise - else: - if self.autocommit: - self.cnx.commit() - self.handle_result(rset) - - def handle_result(self, rset): - """display query results if any""" - if not rset: - print _('No result matching query') - else: - from logilab.common.ureports import Table - children = flatten(izip2(rset.description, rset.rows), to_string) - layout = Table(cols=2*len(rset.rows[0]), children=children, cheaders=1) - self._format(self.writer, layout) - print _('%s results matching query') % rset.rowcount - - def display_schema(self, schema): - """display a schema object""" - attr = schema.__class__.__name__.lower().replace('cubicweb', '') - layout = getattr(self.schema_viewer, 'visit_%s' % attr)(schema) - self._format(self.writer, layout) - - -class CubicWebClientCommand(Command): - """A command line querier for CubicWeb, using the Relation Query Language. - - - identifier of the instance to connect to - """ - name = 'client' - arguments = '' - options = CONNECT_OPTIONS + ( - ("verbose", - {'short': 'v', 'type' : 'int', 'metavar': '', - 'default': 0, - 'help': 'ask confirmation to continue after an error.', - }), - ("batch", - {'short': 'b', 'type' : 'string', 'metavar': '', - 'help': 'file containing a batch of RQL statements to execute.', - }), - ) - - def run(self, args): - """run the command with its specific arguments""" - appid = pop_arg(args, expected_size_after=None) - batch_stream = None - if args: - if len(args) == 1 and args[0] == '-': - batch_stream = sys.stdin - else: - raise BadCommandUsage('too many arguments') - if self.config.batch: - batch_stream = open(self.config.batch) - cli = RQLCli(appid, self.config.user, self.config.password, - self.config.host, self.config.debug) - if batch_stream: - cli.autocommit = True - for line in batch_stream: - line = line.strip() - if not line: - continue - print '>>>', line - cli.handle_line(line) - else: - cli.run() - -register_commands((CubicWebClientCommand,))