def _run(self):
     """
     process metric(s)
     """
     for row in self._elements:
         metric = None
         try:
             #start = time.time()
             if row['type'] == 'metric':
                 metric = MetricElement(row['element_id'], self.index_interval_only)
             else:
                 metric = MultiMetricElement(row['element_id'], self.index_interval_only)
             metric.init()
             metric.set_logger(self._logger)
             metric.update(self.segment_value_id, self.charting_interval_id)
             #print "it took", time.time() - start, "seconds."
         except MySQLdb.Error, message:
             self._logger.error("Metric generator. Report %s update failed. SQL error %s" % (row['element_id'], message))
             log_traceback(self._logger, traceback)
             print simplejson.dumps({'status':'ERROR', 'message':'metric %s update failed. SQL error %s' % (row['element_id'], message)})
             if metric:
                 metric.unlock()
             continue
         except Exception, exc:
             self._logger.error("Metric generator. Report %s update failed. Exception %s" % (row['element_id'], exc))
             log_traceback(self._logger, traceback)
             print simplejson.dumps({'status':'ERROR', 'message':'metric %s update failed. %s' % (row['element_id'], exc)})
             if metric:
                 metric.unlock()
             continue
 def _run(self):
     """
     process report(s)
     """
     for row in self._elements:
         report = None
         try:
             report = Report(self.command, self.process_dataset_ids, self.initial_measurement_time, self.final_measurement_time)
             report.set_logger(self._logger)
             #start = time.time()
             report.init(row['element_id'])
             res = report.update(self.segment_value_id)
             #print "it took", time.time() - start, "seconds."
         except MySQLdb.Error, message:
             self._logger.error("Report generator. Report %s update failed. SQL error %s" % (row['element_id'], message))
             log_traceback(self._logger, traceback)
             print simplejson.dumps({'status': 'ERROR', 'message': 'report %s update failed. SQL error %s' % (row['element_id'], message)})
             if report:
                 report.unlock()
             continue
         except Exception, exc:
             self._logger.error("Report generator. Report %s update failed. Exception %s" % (row['element_id'], exc))
             log_traceback(self._logger, traceback)
             print simplejson.dumps({'status': 'ERROR', 'message': 'report %s update failed. %s' % (row['element_id'], exc)})
             if report:
                 report.unlock()
             continue
 def _drop_table(self):
     try:
         data_manager = ReportDataTableManager(self.element_id, self._logger)
         table_name = data_manager.drop_table()
     except Exception, e:
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status': 'ERROR', 'message': "%s" % e})
         sys.exit()
 def _generate_data(self):
     try:
         data_manager = ReportDataTableManager(self.element_id, self._logger)
         table_name = data_manager.generate_data(self.initial_measurement_time)
     except Exception, e:
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status': 'ERROR', 'message': "%s" % e})
         sys.exit()
 def __init__(self) :
     logger = MLogger('report generator')
     self._logger = logger.get_logger()
     try:
         self._db = DBManager().get_query()
     except MySQLdb.Error, message:
         self._logger.error("Report generator. Init mysql db manager error - %s" % message)
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status': 'ERROR', 'message': '%s' % message})
         sys.exit()
 def _check_element(self):
     try:
         res = self._db.Query("""SELECT dashboard_element.element_id
                         FROM dashboard_element
                     WHERE
                         dashboard_element.`type`='internal report'
                         AND element_id = %s
                         """, (self.element_id, ))
     except MySQLdb.Error, message:
         self._logger.error("Report generator. Try to get element %s" % self.element_id)
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status':'ERROR', 'message':'SQL error %s' % message})
         sys.exit()
 def run(self, validator_command, element_id, extra_id):
     fetched_rows = 0
     self._logger.info('Generator run: %s' % ' '.join(sys.argv))
     try:
         res = self._db.Query("""SELECT dashboard_element.element_id
                         FROM dashboard_element
                     WHERE
                         dashboard_element.`type`='internal report'
                         AND element_id = %s""", (element_id, ))
     except MySQLdb.Error, message:
         self._logger.error("Report validator. Try to get element %s. SQL error %s" % (element_id, message))
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status':'ERROR', 'message':'SQL error %s' % message, 'fetched_rows': ''})
         sys.exit()
    def run(self):
        """
        Process command
        """

        self._logger.info('Generator run: %s' % ' '.join(sys.argv))

        if self.element_id:
            # process specified report
            if self.command in self.delete_commands:
                # process delete command for specified report
                report = ReportPurge(self.element_id, self._logger)
                message = ''
                try:
                    if self.command == 'delete_all':
                        # delete whole report
                        report.delete_all()
                        message = 'Report %s deleted successfully.' % self.element_id
                    elif self.command == 'delete_segment':
                        # delete segment
                        if self.segment_value_id is None:
                            raise Exception('segment is not specified')
                        report.delete_segment(self.segment_value_id)
                        message = 'Segment %s of report %s deleted successfully.' % (self.segment_value_id, self.element_id)
                    elif self.command == 'delete_pivot':
                        # delete pivot
                        if self.pivot_id is None:
                            raise Exception('pivot is not specified')
                        report.delete_pivot(self.pivot_id)
                        message = 'Pivot %s of report %s deleted successfully.' % (self.pivot_id, self.element_id)
                    elif self.command == 'delete_chart':
                        # delete chart
                        if self.chart_id is None:
                            raise Exception('chart is not specified')
                        report.delete_chart(self.chart_id)
                        message = 'Chart %s of report %s deleted successfully.' % (self.chart_id, self.element_id)
                except MySQLdb.Error, message:
                    # process Mysql error
                    self._logger.error("Report generator. Report %s update failed. SQL error %s" % (self.element_id, message))
                    log_traceback(self._logger, traceback)
                    print simplejson.dumps({'status': 'ERROR', 'message': 'SQL error %s' % message})
                    sys.exit()
                except Exception, exc:
                    # process any other error
                    self._logger.error("Report generator. Report %s update failed. Exception %s" % (self.element_id, exc))
                    log_traceback(self._logger, traceback)
                    print simplejson.dumps({'status': 'ERROR', 'message': 'report %s update failed. %s' % (self.element_id, exc)})
                    sys.exit()
                print simplejson.dumps({'status': 'OK', 'message': message})
 def _run_all(self):
     """
     fetch all enabled metrics
     """
     try:
         res = self._db.Query("""SELECT dashboard_element.element_id, dashboard_element.`type`
                         FROM dashboard_element
                     WHERE
                         (dashboard_element.`type`='metric' OR dashboard_element.`type`='multi-metric chart')
                         AND enabled_ind = 'Y'
                         ORDER BY element_id""")
     except MySQLdb.Error, message:
         self._logger.error("Metric generator. Try to get all elements sql error - %s" % message)
         log_traceback(self._logger, traceback)
         print simplejson.dumps({'status':'ERROR', 'message':'SQL error %s' % message})
         sys.exit()
    def _run_one(self):
        """
        fetch specified metric
        """

        try:
            res = self._db.Query("""SELECT dashboard_element.element_id, dashboard_element.`type`
                            FROM dashboard_element
                        WHERE
                            (dashboard_element.`type`='metric' OR dashboard_element.`type`='multi-metric chart')
                            AND element_id = %s
                            """, (self.element_id, )) #AND enabled_ind = 'Y'
        except MySQLdb.Error, message:
            self._logger.error("Metric generator. Try to get element %s" % self.element_id)
            log_traceback(self._logger, traceback)
            print simplejson.dumps({'status':'ERROR', 'message':'SQL error %s' % message})
            sys.exit()
    def run(self):
        """
        Process command
        """
        self._logger.info('Generator run: %s' % ' '.join(sys.argv))

        if self.element_id:
            # process specified metric
            if self.command in self.delete_commands:
                # process delete command
                metric = MetricPurge(self.element_id, self._logger)
                message = ''
                try:
                    if self.command == 'delete_all':
                        # delete whole metric
                        metric.delete_all()
                        message = 'Metric %s deleted successfully.' % self.element_id
                    elif self.command == 'delete_segment':
                        # delete segment
                        if self.segment_value_id is None:
                            raise Exception('segment is not specified')
                        metric.delete_segment(self.segment_value_id)
                        message = 'Segment %s of report %s deleted successfully.' % (self.segment_value_id, self.element_id)
                    elif self.command == 'delete_interval':
                        # delete interval
                        if self.charting_interval_id is None:
                            raise Exception('interval is not specified')
                        metric.delete_interval(self.charting_interval_id, self.segment_value_id)
                        message = 'Interval %s of metric %s deleted successfully.' % (self.charting_interval_id, self.element_id)
                except MySQLdb.Error, message:
                    # process Mysql error
                    self._logger.error("Metric generator. Metric %s update failed. SQL error %s" % (self.element_id, message))
                    log_traceback(self._logger, traceback)
                    print simplejson.dumps({'status':'ERROR', 'message':'SQL error %s' % message})
                    sys.exit()
                except Exception, exc:
                    # process any other error
                    self._logger.error("Metric generator. Metric %s update failed. Exception %s" % (self.element_id, exc))
                    log_traceback(self._logger, traceback)
                    print simplejson.dumps({'status':'ERROR', 'message': 'metric %s update failed. %s' % (self.element_id, exc)})
                    sys.exit()
                print simplejson.dumps({'status':'OK', 'message': message})
                clone_drill_to_links = '-d' in params
                if '-t' in params:
                    _clone_element(db, orig_element_id, new_element_id)
#                    try:
#                        _clone_element(int(params[0]), int(params[1]))
#                    except Exception, e:
#                        # pass warning from MySQL
#                        if str(e) == 'No data - zero rows fetched, selected, or processed':
#                            pass
#                        else:
#                            raise
                clone(db, orig_element_id, new_element_id, clone_pivots, clone_charts, clone_drill_to_links)
            except MySQLdb.Error, message:
                error_message = "Report duplicator. Coping report %s to %s failed. SQL error %s" % (orig_element_id, new_element_id, message)
                _logger.error(error_message)
                log_traceback(_logger, traceback)
                print simplejson.dumps({'status':'ERROR', 'message': error_message})
                exit()
            except Exception, exc:
                error_message = "Report duplicator. Coping report %s to %s failed. Exception %s" % (orig_element_id, new_element_id, exc)
                _logger.error(error_message)
                log_traceback(_logger, traceback)
                print simplejson.dumps({'status':'ERROR', 'message': error_message})
                exit()
            print simplejson.dumps({'status':'OK', 'message': ''})
        else:
            print usage
            sys.exit()
    else:
        print usage
                command, params = validator_commands[validator_command]
            except ValueError:
                self.unknown_command()
            #if validator_command in ['restore_validation_data', 'saving_report', 'save_validation_data']:
            if validator_command in ['restore_validation_data']:
                report.get_data = False
            else:
                report.get_data = True

            report.init(element_id)
            if command:
                fetched_rows = command(**params)
                
        except MySQLdb.Error, message:
            self._logger.error("Report validator. Try to validate element %s. SQL error %s" % (element_id, message))
            log_traceback(self._logger, traceback)
            print simplejson.dumps({'status':'ERROR', 'message':'validation failed. SQL error %s' % message, 'fetched_rows':''})
            sys.exit()
        except Exception, exc:
            self._logger.error("Report validator. Try to validate element %s. Exception %s" % (element_id, exc))
            log_traceback(self._logger, traceback)
            print simplejson.dumps({'status':'ERROR', 'message':'validation failed. %s' % exc, 'fetched_rows': ''})
            sys.exit()

        print simplejson.dumps({'status':'OK', 'message':'report validated successfully', 'fetched_rows': fetched_rows})

    def unknown_command(self):
        print simplejson.dumps({'status': 'ERROR', 'message': 'Unknown validation command', 'fetched_rows':''})
        sys.exit()
        
if __name__ == "__main__":