blob: 52fee4c2ac27061d460af903ea2a2045e1dabc52 [file] [log] [blame]
#!/usr/bin/env python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# -*- coding: utf-8 -*-
'''
gplogextract.py [options] file ...
General Options:
-? | --help show this help message and exit
-v | --version show the program's version number and exit
Options:
-o | --output DIRECTORY output directory
'''
# ============================================================================
__version__ = '$Revision: #1 $'
# ============================================================================
import sys, os
EXECNAME = os.path.split(__file__)[-1]
# ============================================================================
# Python version 2.6.2 is expected, must be between 2.5-3.0
# ============================================================================
if sys.version_info < (2, 5, 0) or sys.version_info >= (3, 0, 0):
sys.stderr.write("""
Error: %s is supported on Python versions 2.5 or greater
Please upgrade python installed on this machine.
""" % EXECNAME)
sys.exit(1)
# ============================================================================
import traceback # exception logging
import optparse # Option Parsing
import csv # CSV format file parsing
# ============================================================================
# Some basic exceptions:
# ============================================================================
class GPError(StandardError): pass
# ============================================================================
def cli_help():
'''
Reads the help file from the docs directory, if documentation file can't
be found this defaults to the __doc__ string.
'''
help_path = os.path.join(sys.path[0], '../docs/cli_help',
EXECNAME + '_help')
f = None
try:
try:
f = open(help_path)
return f.read(-1)
except:
return __doc__
finally:
if f:
f.close()
def usage():
print cli_help()
# ============================================================================
def ParseOptions():
'''
Parses command line options input to the script.
'''
# output = os.getcwd()
output = None
# Setup Options Parser
parser = optparse.OptionParser(usage=cli_help(), add_help_option=False)
parser.add_option('-v', '--version', default=False, action='store_true')
parser.add_option('-?', '--help', default=False, action='store_true')
parser.add_option('-o', '--output', default=output)
(options, args) = parser.parse_args()
# Print version and exit
if options.version:
print EXECNAME + ' ' + __version__
sys.exit(0)
# Print help and exit
if options.help:
usage()
sys.exit(0)
if len(args) < 1:
usage()
sys.exit(1)
return (options, args)
# ============================================================================
# main()
# ============================================================================
if __name__ == '__main__':
(opt, args) = ParseOptions()
try:
if opt.output:
filename = os.path.join(opt.output, 'extracted.sql')
filename = os.path.abspath(filename)
output = open(filename, 'w')
else:
output = sys.stdout
for input in args:
f = open(input)
reader = csv.reader(f, delimiter=',', quotechar='"')
for row in reader:
if len(row) != 30:
raise GPError("Unable to parse file: %s" % input)
time = row[0]
user = row[1]
database = row[2]
type = row[5]
session = row[9]
cmd = row[10]
kind = row[16]
payload = row[18]
if payload.lower().find('statement:') >= 0:
if payload[-1] != ';':
payload += ';'
output.writelines([
"-- User: %s\n" % user,
"-- Database: %s\n" % database,
"-- Session: %s\n" % session,
"-- Timestamp: %s\n" % time,
"%s\n\n" % payload[11:],
])
if kind in ('ERROR', 'FATAL'):
payload.replace("\n", "\n-- ")
output.writelines(["-- %s: %s\n" % (kind, payload)])
# An expected error
except GPError, e:
logger.error(str(e))
logger.info("exit(1)")
sys.exit(1)
# User cancelation
except KeyboardInterrupt, e:
print '[Cancelled]'
sys.exit(1)
# Let SystemExit exceptions through
except SystemExit, e:
raise e
# Catch anything else - shouldn't ever occur
except BaseException, e:
sys.stderr.write('[ERROR] Unhandled error occurred\n')
sys.stderr.write(traceback.format_exc())
sys.exit(1)