From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Clark Williams <williams@redhat.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Tony Jones <tonyj@suse.de>,
Adrian Hunter <adrian.hunter@intel.com>,
Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 16/30] perf script python: Add Python3 support to export-to-postgresql.py
Date: Mon, 11 Mar 2019 23:01:50 -0300 [thread overview]
Message-ID: <20190312020204.22092-17-acme@kernel.org> (raw)
In-Reply-To: <20190312020204.22092-1-acme@kernel.org>
From: Tony Jones <tonyj@suse.de>
Support both Python2 and Python3 in the export-to-postgresql.py script.
The use of 'from __future__' implies the minimum supported Python2 version
is now v2.6
Signed-off-by: Tony Jones <tonyj@suse.de>
Link: http://lkml.kernel.org/r/20190309000518.2438-3-tonyj@suse.de
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
.../scripts/python/export-to-postgresql.py | 58 +++++++++++++------
1 file changed, 41 insertions(+), 17 deletions(-)
diff --git a/tools/perf/scripts/python/export-to-postgresql.py b/tools/perf/scripts/python/export-to-postgresql.py
index 390a351d15ea..00ab972a2eba 100644
--- a/tools/perf/scripts/python/export-to-postgresql.py
+++ b/tools/perf/scripts/python/export-to-postgresql.py
@@ -10,6 +10,8 @@
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
+from __future__ import print_function
+
import os
import sys
import struct
@@ -199,6 +201,18 @@ import datetime
from PySide.QtSql import *
+if sys.version_info < (3, 0):
+ def toserverstr(str):
+ return str
+ def toclientstr(str):
+ return str
+else:
+ # Assume UTF-8 server_encoding and client_encoding
+ def toserverstr(str):
+ return bytes(str, "UTF_8")
+ def toclientstr(str):
+ return bytes(str, "UTF_8")
+
# Need to access PostgreSQL C library directly to use COPY FROM STDIN
from ctypes import *
libpq = CDLL("libpq.so.5")
@@ -234,12 +248,14 @@ perf_db_export_mode = True
perf_db_export_calls = False
perf_db_export_callchains = False
+def printerr(*args, **kw_args):
+ print(*args, file=sys.stderr, **kw_args)
def usage():
- print >> sys.stderr, "Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]"
- print >> sys.stderr, "where: columns 'all' or 'branches'"
- print >> sys.stderr, " calls 'calls' => create calls and call_paths table"
- print >> sys.stderr, " callchains 'callchains' => create call_paths table"
+ printerr("Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]")
+ printerr("where: columns 'all' or 'branches'")
+ printerr(" calls 'calls' => create calls and call_paths table")
+ printerr(" callchains 'callchains' => create call_paths table")
raise Exception("Too few arguments")
if (len(sys.argv) < 2):
@@ -273,7 +289,7 @@ def do_query(q, s):
return
raise Exception("Query failed: " + q.lastError().text())
-print datetime.datetime.today(), "Creating database..."
+print(datetime.datetime.today(), "Creating database...")
db = QSqlDatabase.addDatabase('QPSQL')
query = QSqlQuery(db)
@@ -506,12 +522,12 @@ do_query(query, 'CREATE VIEW samples_view AS '
' FROM samples')
-file_header = struct.pack("!11sii", "PGCOPY\n\377\r\n\0", 0, 0)
-file_trailer = "\377\377"
+file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
+file_trailer = b"\377\377"
def open_output_file(file_name):
path_name = output_dir_name + "/" + file_name
- file = open(path_name, "w+")
+ file = open(path_name, "wb+")
file.write(file_header)
return file
@@ -526,13 +542,13 @@ def copy_output_file_direct(file, table_name):
# Use COPY FROM STDIN because security may prevent postgres from accessing the files directly
def copy_output_file(file, table_name):
- conn = PQconnectdb("dbname = " + dbname)
+ conn = PQconnectdb(toclientstr("dbname = " + dbname))
if (PQstatus(conn)):
raise Exception("COPY FROM STDIN PQconnectdb failed")
file.write(file_trailer)
file.seek(0)
sql = "COPY " + table_name + " FROM STDIN (FORMAT 'binary')"
- res = PQexec(conn, sql)
+ res = PQexec(conn, toclientstr(sql))
if (PQresultStatus(res) != 4):
raise Exception("COPY FROM STDIN PQexec failed")
data = file.read(65536)
@@ -566,7 +582,7 @@ if perf_db_export_calls:
call_file = open_output_file("call_table.bin")
def trace_begin():
- print datetime.datetime.today(), "Writing to intermediate files..."
+ print(datetime.datetime.today(), "Writing to intermediate files...")
# id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs
evsel_table(0, "unknown")
machine_table(0, 0, "unknown")
@@ -582,7 +598,7 @@ def trace_begin():
unhandled_count = 0
def trace_end():
- print datetime.datetime.today(), "Copying to database..."
+ print(datetime.datetime.today(), "Copying to database...")
copy_output_file(evsel_file, "selected_events")
copy_output_file(machine_file, "machines")
copy_output_file(thread_file, "threads")
@@ -597,7 +613,7 @@ def trace_end():
if perf_db_export_calls:
copy_output_file(call_file, "calls")
- print datetime.datetime.today(), "Removing intermediate files..."
+ print(datetime.datetime.today(), "Removing intermediate files...")
remove_output_file(evsel_file)
remove_output_file(machine_file)
remove_output_file(thread_file)
@@ -612,7 +628,7 @@ def trace_end():
if perf_db_export_calls:
remove_output_file(call_file)
os.rmdir(output_dir_name)
- print datetime.datetime.today(), "Adding primary keys"
+ print(datetime.datetime.today(), "Adding primary keys")
do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
do_query(query, 'ALTER TABLE machines ADD PRIMARY KEY (id)')
do_query(query, 'ALTER TABLE threads ADD PRIMARY KEY (id)')
@@ -627,7 +643,7 @@ def trace_end():
if perf_db_export_calls:
do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)')
- print datetime.datetime.today(), "Adding foreign keys"
+ print(datetime.datetime.today(), "Adding foreign keys")
do_query(query, 'ALTER TABLE threads '
'ADD CONSTRAINT machinefk FOREIGN KEY (machine_id) REFERENCES machines (id),'
'ADD CONSTRAINT processfk FOREIGN KEY (process_id) REFERENCES threads (id)')
@@ -663,8 +679,8 @@ def trace_end():
do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
if (unhandled_count):
- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events"
- print datetime.datetime.today(), "Done"
+ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events")
+ print(datetime.datetime.today(), "Done")
def trace_unhandled(event_name, context, event_fields_dict):
global unhandled_count
@@ -674,12 +690,14 @@ def sched__sched_switch(*x):
pass
def evsel_table(evsel_id, evsel_name, *x):
+ evsel_name = toserverstr(evsel_name)
n = len(evsel_name)
fmt = "!hiqi" + str(n) + "s"
value = struct.pack(fmt, 2, 8, evsel_id, n, evsel_name)
evsel_file.write(value)
def machine_table(machine_id, pid, root_dir, *x):
+ root_dir = toserverstr(root_dir)
n = len(root_dir)
fmt = "!hiqiii" + str(n) + "s"
value = struct.pack(fmt, 3, 8, machine_id, 4, pid, n, root_dir)
@@ -690,6 +708,7 @@ def thread_table(thread_id, machine_id, process_id, pid, tid, *x):
thread_file.write(value)
def comm_table(comm_id, comm_str, *x):
+ comm_str = toserverstr(comm_str)
n = len(comm_str)
fmt = "!hiqi" + str(n) + "s"
value = struct.pack(fmt, 2, 8, comm_id, n, comm_str)
@@ -701,6 +720,9 @@ def comm_thread_table(comm_thread_id, comm_id, thread_id, *x):
comm_thread_file.write(value)
def dso_table(dso_id, machine_id, short_name, long_name, build_id, *x):
+ short_name = toserverstr(short_name)
+ long_name = toserverstr(long_name)
+ build_id = toserverstr(build_id)
n1 = len(short_name)
n2 = len(long_name)
n3 = len(build_id)
@@ -709,12 +731,14 @@ def dso_table(dso_id, machine_id, short_name, long_name, build_id, *x):
dso_file.write(value)
def symbol_table(symbol_id, dso_id, sym_start, sym_end, binding, symbol_name, *x):
+ symbol_name = toserverstr(symbol_name)
n = len(symbol_name)
fmt = "!hiqiqiqiqiii" + str(n) + "s"
value = struct.pack(fmt, 6, 8, symbol_id, 8, dso_id, 8, sym_start, 8, sym_end, 4, binding, n, symbol_name)
symbol_file.write(value)
def branch_type_table(branch_type, name, *x):
+ name = toserverstr(name)
n = len(name)
fmt = "!hiii" + str(n) + "s"
value = struct.pack(fmt, 2, 4, branch_type, n, name)
--
2.20.1
next prev parent reply other threads:[~2019-03-12 2:01 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-12 2:01 [GIT PULL 00/30] perf/core improvements and fixes Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 01/30] perf/core: Restore mmap record type correctly Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 02/30] perf script: Support insn output for normal samples Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 03/30] perf report: Support output in nanoseconds Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 04/30] perf time-utils: Add utility function to print time stamps " Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 05/30] perf report: Parse time quantum Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 06/30] perf probe: Fix getting the kernel map Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 07/30] perf vendor events amd: perf PMU events for AMD Family 17h Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 08/30] perf data: Support having perf.data stored as a directory Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 09/30] perf data: Don't store auxtrace index for directory data file Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 10/30] perf data: Add perf_data__update_dir() function Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 11/30] perf data: Make perf_data__size() work over directory Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 12/30] perf header: Add DIR_FORMAT feature to describe directory data Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 13/30] perf session: Add process callback to reader object Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 14/30] perf report: Use less for scripts output Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 15/30] perf script python: Add Python3 support to exported-sql-viewer.py Arnaldo Carvalho de Melo
2019-03-12 2:01 ` Arnaldo Carvalho de Melo [this message]
2019-03-12 2:01 ` [PATCH 17/30] perf script python: Add Python3 support to export-to-sqlite.py Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 18/30] perf script python: Add printdate function to SQL exporters Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 19/30] perf tools: Update x86's syscall_64.tbl, no change in tools/perf behaviour Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 20/30] tools headers uapi: Sync copy of asm-generic/unistd.h with the kernel sources Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 21/30] tools headers uapi: Update linux/in.h copy Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 22/30] perf script: Filter COMM/FORK/.. events by CPU Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 23/30] perf report: Support time sort key Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 24/30] perf report: Support running scripts for current time range Arnaldo Carvalho de Melo
2019-03-12 2:01 ` [PATCH 25/30] perf report: Support builtin perf script in scripts menu Arnaldo Carvalho de Melo
2019-03-12 2:02 ` [PATCH 26/30] perf report: Implement browsing of individual samples Arnaldo Carvalho de Melo
2019-03-12 2:02 ` [PATCH 27/30] perf tools: Add some new tips describing the new options Arnaldo Carvalho de Melo
2019-03-12 2:02 ` [PATCH 28/30] perf script: Add array bound checking to list_scripts Arnaldo Carvalho de Melo
2019-03-12 2:02 ` [PATCH 29/30] perf ui browser: Fix ui popup argv browser for many entries Arnaldo Carvalho de Melo
2019-03-12 2:02 ` [PATCH 30/30] perf tools report: Add custom scripts to script menu Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190312020204.22092-17-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=s1seetee@linux.vnet.ibm.com \
--cc=tonyj@suse.de \
--cc=williams@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).