// PgQueryColumns parses the query and generates a type for it. func PgQueryColumns(args *internal.ArgType, inspect []string) ([]*models.Column, error) { var err error // create temporary view xoid xoid := "_xo_" + internal.GenRandomID() viewq := `CREATE TEMPORARY VIEW ` + xoid + ` AS (` + strings.Join(inspect, "\n") + `)` models.XOLog(viewq) _, err = args.DB.Exec(viewq) if err != nil { return nil, err } // query to determine schema name where temporary view was created var nspq = `SELECT n.nspname ` + `FROM pg_class c ` + `JOIN pg_namespace n ON n.oid = c.relnamespace ` + `WHERE n.nspname LIKE 'pg_temp%' AND c.relname = $1` // run query var schema string models.XOLog(nspq, xoid) err = args.DB.QueryRow(nspq, xoid).Scan(&schema) if err != nil { return nil, err } // load column information return models.PgTableColumns(args.DB, schema, xoid, false) }
// OrQueryColumns parses the query and generates a type for it. func OrQueryColumns(args *internal.ArgType, inspect []string) ([]*models.Column, error) { var err error // create temporary view xoid xoid := "XO$" + internal.GenRandomID() viewq := `CREATE GLOBAL TEMPORARY TABLE ` + xoid + ` ` + `ON COMMIT PRESERVE ROWS ` + `AS ` + strings.Join(inspect, "\n") models.XOLog(viewq) _, err = args.DB.Exec(viewq) if err != nil { return nil, err } // load columns cols, err := models.OrTableColumns(args.DB, args.Schema, xoid) // drop inspect view dropq := `DROP TABLE ` + xoid models.XOLog(dropq) _, _ = args.DB.Exec(dropq) // load column information return cols, err }
// MsQueryColumns parses the query and generates a type for it. func MsQueryColumns(args *internal.ArgType, inspect []string) ([]*models.Column, error) { var err error // process inspect -- cannot have 'order by' in a CREATE VIEW ins := []string{} for _, l := range inspect { if !strings.HasPrefix(strings.ToUpper(l), "ORDER BY ") { ins = append(ins, l) } } // create temporary view xoid xoid := "_xo_" + internal.GenRandomID() viewq := `CREATE VIEW ` + xoid + ` AS ` + strings.Join(ins, "\n") models.XOLog(viewq) _, err = args.DB.Exec(viewq) if err != nil { return nil, err } // load columns cols, err := models.MsTableColumns(args.DB, args.Schema, xoid) // drop inspect view dropq := `DROP VIEW ` + xoid models.XOLog(dropq) _, _ = args.DB.Exec(dropq) // load column information return cols, err }
// SqQueryColumns parses a sqlite query and generates a type for it. func SqQueryColumns(args *internal.ArgType, inspect []string) ([]*models.Column, error) { var err error // create temporary view xoid xoid := "_xo_" + internal.GenRandomID() viewq := `CREATE TEMPORARY VIEW ` + xoid + ` AS ` + strings.Join(inspect, "\n") models.XOLog(viewq) _, err = args.DB.Exec(viewq) if err != nil { return nil, err } // load column information return models.SqTableColumns(args.DB, xoid) }
// MyQueryColumns parses the query and generates a type for it. func MyQueryColumns(args *internal.ArgType, inspect []string) ([]*models.Column, error) { var err error // create temporary view xoid xoid := "_xo_" + internal.GenRandomID() viewq := `CREATE VIEW ` + xoid + ` AS (` + strings.Join(inspect, "\n") + `)` models.XOLog(viewq) _, err = args.DB.Exec(viewq) if err != nil { return nil, err } // load columns cols, err := models.MyTableColumns(args.DB, args.Schema, xoid) // drop inspect view dropq := `DROP VIEW ` + xoid models.XOLog(dropq) _, _ = args.DB.Exec(dropq) // load column information return cols, err }