more cleanups
[pstop.git] / p_s / file_summary_by_instance / public.go
diff --git a/p_s/file_summary_by_instance/public.go b/p_s/file_summary_by_instance/public.go
new file mode 100644 (file)
index 0000000..408f445
--- /dev/null
@@ -0,0 +1,134 @@
+// p_s - library routines for pstop.
+//
+// This file contains the library routines for managing the
+// file_summary_by_instance table.
+package file_summary_by_instance
+
+import (
+       "database/sql"
+       "fmt"
+       "time"
+
+       "github.com/sjmudd/pstop/lib"
+       "github.com/sjmudd/pstop/p_s"
+)
+
+// a table of rows
+type Object struct {
+       p_s.RelativeStats
+       p_s.InitialTime
+       initial          table_rows
+       current          table_rows
+       results          table_rows
+       totals           table_row
+       global_variables map[string]string
+}
+
+// reset the statistics to current values
+func (t *Object) SyncReferenceValues() {
+       t.SetNow()
+       t.initial = make(table_rows, len(t.current))
+       copy(t.initial, t.current)
+
+       t.results = make(table_rows, len(t.current))
+       copy(t.results, t.current)
+
+       if t.WantRelativeStats() {
+               t.results.subtract(t.initial) // should be 0 if relative
+       }
+
+       t.results.sort()
+       t.totals = t.results.totals()
+}
+
+// Collect data from the db, then merge it in.
+func (t *Object) Collect(dbh *sql.DB) {
+       start := time.Now()
+       // UPDATE current from db handle
+       t.current = merge_by_table_name(select_rows(dbh), t.global_variables)
+
+       // copy in initial data if it was not there
+       if len(t.initial) == 0 && len(t.current) > 0 {
+               t.initial = make(table_rows, len(t.current))
+               copy(t.initial, t.current)
+       }
+
+       // check for reload initial characteristics
+       if t.initial.needs_refresh(t.current) {
+               t.initial = make(table_rows, len(t.current))
+               copy(t.initial, t.current)
+       }
+
+       // update results to current value
+       t.results = make(table_rows, len(t.current))
+       copy(t.results, t.current)
+
+       // make relative if need be
+       if t.WantRelativeStats() {
+               t.results.subtract(t.initial)
+       }
+
+       // sort the results
+       t.results.sort()
+
+       // setup the totals
+       t.totals = t.results.totals()
+       lib.Logger.Println("Object.Collect() took:", time.Duration(time.Since(start)).String())
+}
+
+// return the headings for a table
+func (t Object) Headings() string {
+       var r table_row
+
+       return r.headings()
+}
+
+// return the rows we need for displaying
+func (t Object) RowContent(max_rows int) []string {
+       rows := make([]string, 0, max_rows)
+
+       for i := range t.results {
+               if i < max_rows {
+                       rows = append(rows, t.results[i].row_content(t.totals))
+               }
+       }
+
+       return rows
+}
+
+// return all the totals
+func (t Object) TotalRowContent() string {
+       return t.totals.row_content(t.totals)
+}
+
+// return an empty string of data (for filling in)
+func (t Object) EmptyRowContent() string {
+       var emtpy table_row
+       return emtpy.row_content(emtpy)
+}
+
+func (t Object) Description() string {
+       count := t.count_rows()
+       return fmt.Sprintf("I/O Latency by File (file_summary_by_instance) %4d row(s)    ", count)
+}
+
+// create a new structure and include various variable values:
+// - datadir, relay_log
+// There's no checking that these are actually provided!
+func NewFileSummaryByInstance(global_variables map[string]string) *Object {
+       n := new(Object)
+
+       n.global_variables = global_variables
+
+       return n
+}
+
+func (t Object) count_rows() int {
+       var count int
+       for row := range t.results {
+               if t.results[row].SUM_TIMER_WAIT > 0 {
+                       count++
+               }
+       }
+       return count
+}