This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 156304
Collapse All | Expand All

(-)a/db.metadata.model/manifest.mf (-2 / +2 lines)
Lines 1-5 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.modules.db.metadata.model/0
2
OpenIDE-Module: org.netbeans.modules.db.metadata.model/1
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/db/metadata/model/resources/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/db/metadata/model/resources/Bundle.properties
4
OpenIDE-Module-Specification-Version: 0.21
4
OpenIDE-Module-Specification-Version: 1.0
5
AutoUpdate-Show-In-Client: false
5
AutoUpdate-Show-In-Client: false
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataAccessor.java (+4 lines)
Lines 46-51 Link Here
46
import org.netbeans.modules.db.metadata.model.api.Column;
46
import org.netbeans.modules.db.metadata.model.api.Column;
47
import org.netbeans.modules.db.metadata.model.api.ForeignKey;
47
import org.netbeans.modules.db.metadata.model.api.ForeignKey;
48
import org.netbeans.modules.db.metadata.model.api.ForeignKeyColumn;
48
import org.netbeans.modules.db.metadata.model.api.ForeignKeyColumn;
49
import org.netbeans.modules.db.metadata.model.api.Function;
49
import org.netbeans.modules.db.metadata.model.api.Index;
50
import org.netbeans.modules.db.metadata.model.api.Index;
50
import org.netbeans.modules.db.metadata.model.api.IndexColumn;
51
import org.netbeans.modules.db.metadata.model.api.IndexColumn;
51
import org.netbeans.modules.db.metadata.model.api.Metadata;
52
import org.netbeans.modules.db.metadata.model.api.Metadata;
Lines 61-66 Link Here
61
import org.netbeans.modules.db.metadata.model.spi.ColumnImplementation;
62
import org.netbeans.modules.db.metadata.model.spi.ColumnImplementation;
62
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyColumnImplementation;
63
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyColumnImplementation;
63
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyImplementation;
64
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyImplementation;
65
import org.netbeans.modules.db.metadata.model.spi.FunctionImplementation;
64
import org.netbeans.modules.db.metadata.model.spi.IndexColumnImplementation;
66
import org.netbeans.modules.db.metadata.model.spi.IndexColumnImplementation;
65
import org.netbeans.modules.db.metadata.model.spi.IndexImplementation;
67
import org.netbeans.modules.db.metadata.model.spi.IndexImplementation;
66
import org.netbeans.modules.db.metadata.model.spi.MetadataImplementation;
68
import org.netbeans.modules.db.metadata.model.spi.MetadataImplementation;
Lines 120-125 Link Here
120
122
121
    public abstract Procedure createProcedure(ProcedureImplementation impl);
123
    public abstract Procedure createProcedure(ProcedureImplementation impl);
122
124
125
    public abstract Function createFunction(FunctionImplementation impl);
126
123
    public abstract Schema createSchema(SchemaImplementation impl);
127
    public abstract Schema createSchema(SchemaImplementation impl);
124
128
125
    public abstract Table createTable(TableImplementation impl);
129
    public abstract Table createTable(TableImplementation impl);
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataUtilities.java (+17 lines)
Lines 188-191 Link Here
188
            throw new SQLException(t);
188
            throw new SQLException(t);
189
        }
189
        }
190
    }
190
    }
191
192
    /**
193
     * Call {@link DatabaseMetaData#geFunctions(String, String, String)},
194
     * wrapping any internal runtime exception into an {@link SQLException}.
195
     */
196
    public static ResultSet getFunctions(DatabaseMetaData dmd,
197
            String catalog, String schemaPattern, String functionNamePattern)
198
            throws SQLException {
199
        try {
200
            return dmd.getFunctions(catalog, schemaPattern,
201
                    functionNamePattern);
202
        } catch (SQLException e) {
203
            throw e;
204
        } catch (Throwable t) {
205
            throw new SQLException(t);
206
        }
207
    }
191
}
208
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/Procedure.java (-19 / +26 lines)
Lines 39-64 Link Here
39
 *
39
 *
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
41
 */
41
 */
42
43
package org.netbeans.modules.db.metadata.model.api;
42
package org.netbeans.modules.db.metadata.model.api;
44
43
45
import java.util.Collection;
44
import java.util.Collection;
46
import org.netbeans.modules.db.metadata.model.spi.ProcedureImplementation;
45
import org.netbeans.modules.db.metadata.model.spi.FunctionImplementation;
47
46
48
/**
47
/**
49
 *
48
 *
50
 * @author Andrei Badea
49
 * @author Andrei Badea, Matthias42
50
 *
51
 * @since db.metadata.model/1.0
51
 */
52
 */
52
public class Procedure extends Tuple {
53
public class Function extends Tuple {
53
54
54
    final ProcedureImplementation impl;
55
    final FunctionImplementation impl;
55
56
56
    Procedure(ProcedureImplementation impl) {
57
    Function(FunctionImplementation impl) {
57
        this.impl = impl;
58
        this.impl = impl;
58
    }
59
    }
59
60
60
    /**
61
    /**
61
     * Returns the schema containing this table.
62
     * Returns the schema containing this function.
62
     *
63
     *
63
     * @return the parent schema.
64
     * @return the parent schema.
64
     */
65
     */
Lines 76-94 Link Here
76
    }
77
    }
77
78
78
    /**
79
    /**
79
     * Returns the return value of this procedure
80
     * Returns the return value of this function
80
     * 
81
     *
81
     * @return the return value for this procedure
82
     * @return the return value for this function
82
     */
83
     */
83
    public Value getReturnValue() {
84
    public Value getReturnValue() {
84
        return impl.getReturnValue();
85
        return impl.getReturnValue();
85
    }
86
    }
86
87
87
    /**
88
    /**
88
     * Returns the columns in the result set for this procedure.
89
     * Returns the columns in the result set for this function.
89
     *
90
     *
90
     * @return the columns.
91
     * @return the columns.
91
     * @throws MetadataException if an error occurs while retrieving the metadata.
92
     * @throws MetadataException if an error occurs while retrieving the
93
     * metadata.
92
     */
94
     */
93
    public Collection<Column> getColumns() {
95
    public Collection<Column> getColumns() {
94
        return impl.getColumns();
96
        return impl.getColumns();
Lines 98-115 Link Here
98
     * Returns the column with the given name.
100
     * Returns the column with the given name.
99
     *
101
     *
100
     * @param name a column name.
102
     * @param name a column name.
101
     * @return a column named {@code name} or {@code null} if there is no such column.
103
     * @return a column named {@code name} or {@code null} if there is no such
102
     * @throws MetadataException if an error occurs while retrieving the metadata.
104
     * column.
105
     * @throws MetadataException if an error occurs while retrieving the
106
     * metadata.
103
     */
107
     */
104
    public Column getColumn(String name) {
108
    public Column getColumn(String name) {
105
        return impl.getColumn(name);
109
        return impl.getColumn(name);
106
    }
110
    }
107
111
108
    /**
112
    /**
109
     * Returns the list of parameters for this procedure
113
     * Returns the list of parameters for this function
110
     *
114
     *
111
     * @return the list of parameters for this procedure
115
     * @return the list of parameters for this function
112
     * @throws MetadataException if an error occurs while retrieving the metadata
116
     * @throws MetadataException if an error occurs while retrieving the
117
     * metadata
113
     */
118
     */
114
    public Collection<Parameter> getParameters() {
119
    public Collection<Parameter> getParameters() {
115
        return impl.getParameters();
120
        return impl.getParameters();
Lines 117-123 Link Here
117
122
118
    /**
123
    /**
119
     * Returns the parameter with the given name
124
     * Returns the parameter with the given name
120
     * @throws MetadataException if an error occurs while retrieving the metadata
125
     *
126
     * @throws MetadataException if an error occurs while retrieving the
127
     * metadata
121
     */
128
     */
122
    public Parameter getParameter(String name) {
129
    public Parameter getParameter(String name) {
123
        return impl.getParameter(name);
130
        return impl.getParameter(name);
Lines 132-137 Link Here
132
139
133
    @Override
140
    @Override
134
    public String toString() {
141
    public String toString() {
135
        return "View[name='" + getName() + "']"; // NOI18N
142
        return "Function[name='" + getName() + "']"; // NOI18N
136
    }
143
    }
137
}
144
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/Metadata.java (+6 lines)
Lines 50-55 Link Here
50
import org.netbeans.modules.db.metadata.model.spi.ColumnImplementation;
50
import org.netbeans.modules.db.metadata.model.spi.ColumnImplementation;
51
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyColumnImplementation;
51
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyColumnImplementation;
52
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyImplementation;
52
import org.netbeans.modules.db.metadata.model.spi.ForeignKeyImplementation;
53
import org.netbeans.modules.db.metadata.model.spi.FunctionImplementation;
53
import org.netbeans.modules.db.metadata.model.spi.IndexColumnImplementation;
54
import org.netbeans.modules.db.metadata.model.spi.IndexColumnImplementation;
54
import org.netbeans.modules.db.metadata.model.spi.IndexImplementation;
55
import org.netbeans.modules.db.metadata.model.spi.IndexImplementation;
55
import org.netbeans.modules.db.metadata.model.spi.MetadataImplementation;
56
import org.netbeans.modules.db.metadata.model.spi.MetadataImplementation;
Lines 170-175 Link Here
170
        }
171
        }
171
172
172
        @Override
173
        @Override
174
        public Function createFunction(FunctionImplementation impl) {
175
            return new Function(impl);
176
        }
177
178
        @Override
173
        public Parameter createParameter(ParameterImplementation impl) {
179
        public Parameter createParameter(ParameterImplementation impl) {
174
            return new Parameter(impl);
180
            return new Parameter(impl);
175
        }
181
        }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/MetadataElementHandle.java (-2 / +33 lines)
Lines 75-80 Link Here
75
    private static final int FOREIGN_KEY = 3;
75
    private static final int FOREIGN_KEY = 3;
76
    private static final int FOREIGN_KEY_COLUMN = 4;
76
    private static final int FOREIGN_KEY_COLUMN = 4;
77
    private static final int INDEX_COLUMN = 4;
77
    private static final int INDEX_COLUMN = 4;
78
    private static final int FUNCTION = 2;
78
79
79
    // The hierarchy of names for this element (e.g. ["mycatalog","myschema","mytable","mycolumn"])
80
    // The hierarchy of names for this element (e.g. ["mycatalog","myschema","mytable","mycolumn"])
80
    //
81
    //
Lines 196-201 Link Here
196
                return (T) resolveForeignKeyColumn(metadata);
197
                return (T) resolveForeignKeyColumn(metadata);
197
            case INDEX_COLUMN:
198
            case INDEX_COLUMN:
198
                return (T) resolveIndexColumn(metadata);
199
                return (T) resolveIndexColumn(metadata);
200
            case RETURN_VALUE:
201
                return (T) resolveReturnValue(metadata);
202
            case FUNCTION:
203
                return (T) resolveFunction(metadata);
199
            default:
204
            default:
200
                throw new IllegalStateException("Unhandled kind " + kinds[kinds.length -1]);
205
                throw new IllegalStateException("Unhandled kind " + kinds[kinds.length -1]);
201
        }
206
        }
Lines 236-247 Link Here
236
241
237
    private Procedure resolveProcedure(Metadata metadata) {
242
    private Procedure resolveProcedure(Metadata metadata) {
238
        Schema schema = resolveSchema(metadata);
243
        Schema schema = resolveSchema(metadata);
239
        if (schema != null) {
244
        if (schema != null && kinds[PROCEDURE] == Kind.PROCEDURE) {
240
            return schema.getProcedure(names[PROCEDURE]);
245
            return schema.getProcedure(names[PROCEDURE]);
241
        }
246
        }
242
        return null;
247
        return null;
243
    }
248
    }
244
249
250
    private Function resolveFunction(Metadata metadata) {
251
        Schema schema = resolveSchema(metadata);
252
        if (schema != null && kinds[FUNCTION] == Kind.FUNCTION) {
253
            return schema.getFunction(names[FUNCTION]);
254
        }
255
        return null;
256
    }
257
258
    private Value resolveReturnValue(Metadata metadata) {
259
        Function proc = resolveFunction(metadata);
260
        if (proc != null) {
261
            return proc.getReturnValue();
262
        }
263
        Procedure proc2 = resolveProcedure(metadata);
264
        if (proc2 != null) {
265
            return proc2.getReturnValue();
266
        }
267
        return null;
268
    }
269
245
    private PrimaryKey resolvePrimaryKey(Metadata metadata) {
270
    private PrimaryKey resolvePrimaryKey(Metadata metadata) {
246
        Table table = resolveTable(metadata);
271
        Table table = resolveTable(metadata);
247
        if (table != null) {
272
        if (table != null) {
Lines 283-288 Link Here
283
        if (proc != null) {
308
        if (proc != null) {
284
            return proc.getParameter(names[PARAMETER]);
309
            return proc.getParameter(names[PARAMETER]);
285
        }
310
        }
311
        Function proc2 = resolveFunction(metadata);
312
        if (proc2 != null) {
313
            return proc2.getParameter(names[PARAMETER]);
314
        }
286
        return null;
315
        return null;
287
    }
316
    }
288
317
Lines 335-341 Link Here
335
        FOREIGN_KEY(ForeignKey.class),
364
        FOREIGN_KEY(ForeignKey.class),
336
        INDEX(Index.class),
365
        INDEX(Index.class),
337
        FOREIGN_KEY_COLUMN(ForeignKeyColumn.class),
366
        FOREIGN_KEY_COLUMN(ForeignKeyColumn.class),
338
        INDEX_COLUMN(IndexColumn.class);
367
        INDEX_COLUMN(IndexColumn.class),
368
        RETURN_VALUE(Value.class),
369
        FUNCTION(Function.class);
339
370
340
        public static Kind of(MetadataElement element) {
371
        public static Kind of(MetadataElement element) {
341
            return of(element.getClass());
372
            return of(element.getClass());
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/Parameter.java (-5 lines)
Lines 62-72 Link Here
62
        this.impl = impl;
62
        this.impl = impl;
63
    }
63
    }
64
64
65
    @Override
66
    public Procedure getParent() {
67
        return impl.getParent();
68
    }
69
70
    public Direction getDirection() {
65
    public Direction getDirection() {
71
        return impl.getDirection();
66
        return impl.getDirection();
72
    }
67
    }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/Procedure.java (-2 / +2 lines)
Lines 58-64 Link Here
58
    }
58
    }
59
59
60
    /**
60
    /**
61
     * Returns the schema containing this table.
61
     * Returns the schema containing this procedure.
62
     *
62
     *
63
     * @return the parent schema.
63
     * @return the parent schema.
64
     */
64
     */
Lines 132-137 Link Here
132
132
133
    @Override
133
    @Override
134
    public String toString() {
134
    public String toString() {
135
        return "View[name='" + getName() + "']"; // NOI18N
135
        return "Procedure[name='" + getName() + "']";                  // NOI18N
136
    }
136
    }
137
}
137
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/api/Schema.java (-1 / +27 lines)
Lines 137-143 Link Here
137
    }
137
    }
138
138
139
    /**
139
    /**
140
     * Get the list of procedures for thi shema
140
     * Get the list of procedures for this schema
141
     *
141
     *
142
     * @return the procedures
142
     * @return the procedures
143
     * @throws MetadataException if an error occurs while retrieving the metadata
143
     * @throws MetadataException if an error occurs while retrieving the metadata
Lines 158-163 Link Here
158
    }
158
    }
159
159
160
    /**
160
    /**
161
     * Get the list of functions for this schema
162
     *
163
     * @return the functions
164
     * @throws MetadataException if an error occurs while retrieving the
165
     * metadata
166
     * @since db.metadata.model/1.0
167
     */
168
    public Collection<Function> getFunctions() {
169
        return impl.getFunctions();
170
    }
171
172
    /**
173
     * Return a function with the given name
174
     *
175
     * @param name a function name
176
     * @return a function named {@code name} or {@code null} if there is no such
177
     * function.
178
     * @throws MetadataException if an error occurs while retrieving the
179
     * metadata
180
     * @since db.metadata.model/1.0
181
     */
182
    public Function getFunction(String name) {
183
        return impl.getFunction(name);
184
    }
185
186
    /**
161
     * Refresh the metadata for this schema
187
     * Refresh the metadata for this schema
162
     */
188
     */
163
    public void refresh() {
189
    public void refresh() {
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCProcedure.java (-24 / +20 lines)
Lines 39-45 Link Here
39
 *
39
 *
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
41
 */
41
 */
42
43
package org.netbeans.modules.db.metadata.model.jdbc;
42
package org.netbeans.modules.db.metadata.model.jdbc;
44
43
45
import java.sql.DatabaseMetaData;
44
import java.sql.DatabaseMetaData;
Lines 55-81 Link Here
55
import org.netbeans.modules.db.metadata.model.api.Column;
54
import org.netbeans.modules.db.metadata.model.api.Column;
56
import org.netbeans.modules.db.metadata.model.api.MetadataException;
55
import org.netbeans.modules.db.metadata.model.api.MetadataException;
57
import org.netbeans.modules.db.metadata.model.api.Parameter;
56
import org.netbeans.modules.db.metadata.model.api.Parameter;
58
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
59
import org.netbeans.modules.db.metadata.model.api.Schema;
57
import org.netbeans.modules.db.metadata.model.api.Schema;
60
import org.netbeans.modules.db.metadata.model.api.Value;
58
import org.netbeans.modules.db.metadata.model.api.Value;
61
import org.netbeans.modules.db.metadata.model.spi.ProcedureImplementation;
59
import org.netbeans.modules.db.metadata.model.spi.FunctionImplementation;
62
60
63
/**
61
/**
64
 *
62
 *
65
 * @author David Van Couvering
63
 * @author David Van Couvering
66
 */
64
 */
67
public class JDBCProcedure extends ProcedureImplementation {
65
public class JDBCFunction extends FunctionImplementation {
68
66
69
    private static final Logger LOGGER = Logger.getLogger(JDBCProcedure.class.getName());
67
    private static final Logger LOGGER = Logger.getLogger(JDBCFunction.class.getName());
70
71
    private final JDBCSchema jdbcSchema;
68
    private final JDBCSchema jdbcSchema;
72
    private final String name;
69
    private final String name;
73
74
    private Map<String, Column> columns;
70
    private Map<String, Column> columns;
75
    private Map<String, Parameter> parameters;
71
    private Map<String, Parameter> parameters;
76
    private Value returnValue;
72
    private Value returnValue;
77
73
78
    public JDBCProcedure(JDBCSchema jdbcSchema, String name) {
74
    public JDBCFunction(JDBCSchema jdbcSchema, String name) {
79
        this.jdbcSchema = jdbcSchema;
75
        this.jdbcSchema = jdbcSchema;
80
        this.name = name;
76
        this.name = name;
81
    }
77
    }
Lines 123-168 Link Here
123
119
124
    @Override
120
    @Override
125
    public String toString() {
121
    public String toString() {
126
        return "JDBCProcedure[name='" + name + "']"; // NOI18N
122
        return "JDBCFunction[name='" + name + "']"; // NOI18N
127
    }
123
    }
128
124
129
    protected JDBCColumn createJDBCColumn(int position, ResultSet rs) throws SQLException {
125
    protected JDBCColumn createJDBCColumn(int position, ResultSet rs) throws SQLException {
130
        return new JDBCColumn(this.getProcedure(), position, JDBCValue.createProcedureValue(rs));
126
        return new JDBCColumn(this.getFunction(), position, JDBCValue.createFunctionValue(rs, this.getFunction()));
131
    }
127
    }
132
128
133
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
129
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
134
        Direction direction = JDBCUtils.getDirection(rs.getShort("COLUMN_TYPE"));
130
        Parameter.Direction direction = JDBCUtils.getFunctionDirection(rs.getShort("COLUMN_TYPE"));
135
        return new JDBCParameter(this, JDBCValue.createProcedureValue(rs), direction, position);
131
        return new JDBCParameter(this.getFunction(), JDBCValue.createFunctionValue(rs, this.getFunction()), direction, position);
136
    }
132
    }
137
133
138
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
134
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
139
        return JDBCValue.createProcedureValue(rs);
135
        return JDBCValue.createFunctionValue(rs, this.getFunction());
140
    }
136
    }
141
137
142
    protected void createProcedureInfo() {
138
    protected void createProcedureInfo() {
143
        LOGGER.log(Level.FINE, "Initializing procedure info in " + this);
139
        LOGGER.log(Level.FINE, "Initializing procedure info in " + this);
144
        
140
145
        Map<String, Column> newColumns = new LinkedHashMap<String, Column>();
141
        Map<String, Column> newColumns = new LinkedHashMap<String, Column>();
146
        Map<String, Parameter> newParams = new LinkedHashMap<String, Parameter>();
142
        Map<String, Parameter> newParams = new LinkedHashMap<String, Parameter>();
147
        int resultCount = 0;
143
        int resultCount = 0;
148
        int paramCount = 0;
144
        int paramCount = 0;
149
145
150
        try {
146
        try {
151
            ResultSet rs = jdbcSchema.getJDBCCatalog().getJDBCMetadata().getDmd().getProcedureColumns(jdbcSchema.getJDBCCatalog().getName(), jdbcSchema.getName(), name, "%"); // NOI18N
147
            ResultSet rs = jdbcSchema.getJDBCCatalog().getJDBCMetadata().getDmd().getFunctionColumns(jdbcSchema.getJDBCCatalog().getName(), jdbcSchema.getName(), name, "%"); // NOI18N
152
            try {
148
            try {
153
                while (rs.next()) {
149
                while (rs.next()) {
154
                    short columnType = rs.getShort("COLUMN_TYPE");
150
                    short columnType = rs.getShort("COLUMN_TYPE");
155
                    switch (columnType) {
151
                    switch (columnType) {
156
                        case DatabaseMetaData.procedureColumnResult:
152
                        case DatabaseMetaData.functionColumnResult:
157
                            addColumn(++resultCount, rs, newColumns);
153
                            addColumn(++resultCount, rs, newColumns);
158
                            break;
154
                            break;
159
                        case DatabaseMetaData.procedureColumnIn:
155
                        case DatabaseMetaData.functionColumnIn:
160
                        case DatabaseMetaData.procedureColumnInOut:
156
                        case DatabaseMetaData.functionColumnInOut:
161
                        case DatabaseMetaData.procedureColumnOut:
157
                        case DatabaseMetaData.functionColumnOut:
162
                        case DatabaseMetaData.procedureColumnUnknown:
158
                        case DatabaseMetaData.functionColumnUnknown:
163
                            addParameter(++paramCount, rs, newParams);
159
                            addParameter(++paramCount, rs, newParams);
164
                            break;
160
                            break;
165
                        case DatabaseMetaData.procedureColumnReturn:
161
                        case DatabaseMetaData.functionReturn:
166
                            setReturnValue(rs);
162
                            setReturnValue(rs);
167
                            break;
163
                            break;
168
                        default:
164
                        default:
Lines 181-194 Link Here
181
        parameters = Collections.unmodifiableMap(newParams);
177
        parameters = Collections.unmodifiableMap(newParams);
182
    }
178
    }
183
179
184
    private void addColumn(int position, ResultSet rs, Map<String,Column> newColumns) throws SQLException {
180
    private void addColumn(int position, ResultSet rs, Map<String, Column> newColumns) throws SQLException {
185
        Column column = createJDBCColumn(position, rs).getColumn();
181
        Column column = createJDBCColumn(position, rs).getColumn();
186
        newColumns.put(column.getName(), column);
182
        newColumns.put(column.getName(), column);
187
        LOGGER.log(Level.FINE, "Created column {0}", column);
183
        LOGGER.log(Level.FINE, "Created column {0}", column);
188
    }
184
    }
189
185
190
    private void addParameter(int position, ResultSet rs, Map<String,Parameter> newParams) throws SQLException {
186
    private void addParameter(int position, ResultSet rs, Map<String, Parameter> newParams) throws SQLException {
191
        Parameter  param = createJDBCParameter(position, rs).getParameter();
187
        Parameter param = createJDBCParameter(position, rs).getParameter();
192
        newParams.put(param.getName(), param);
188
        newParams.put(param.getName(), param);
193
        LOGGER.log(Level.FINE, "Created parameter {0}", param);
189
        LOGGER.log(Level.FINE, "Created parameter {0}", param);
194
    }
190
    }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCParameter.java (-6 / +6 lines)
Lines 45-51 Link Here
45
import java.util.logging.Logger;
45
import java.util.logging.Logger;
46
import org.netbeans.modules.db.metadata.model.api.Nullable;
46
import org.netbeans.modules.db.metadata.model.api.Nullable;
47
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
47
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
48
import org.netbeans.modules.db.metadata.model.api.Procedure;
48
import org.netbeans.modules.db.metadata.model.api.MetadataElement;
49
import org.netbeans.modules.db.metadata.model.api.SQLType;
49
import org.netbeans.modules.db.metadata.model.api.SQLType;
50
import org.netbeans.modules.db.metadata.model.spi.ParameterImplementation;
50
import org.netbeans.modules.db.metadata.model.spi.ParameterImplementation;
51
51
Lines 56-68 Link Here
56
public class JDBCParameter extends ParameterImplementation {
56
public class JDBCParameter extends ParameterImplementation {
57
57
58
    private static final Logger LOGGER = Logger.getLogger(JDBCParameter.class.getName());
58
    private static final Logger LOGGER = Logger.getLogger(JDBCParameter.class.getName());
59
    private final JDBCProcedure jdbcProcedure;
59
    private final MetadataElement parent;
60
    private final Direction direction;
60
    private final Direction direction;
61
    private final int ordinalPosition;
61
    private final int ordinalPosition;
62
    private final JDBCValue value;
62
    private final JDBCValue value;
63
63
64
    public JDBCParameter(JDBCProcedure jdbcProcedure, JDBCValue value, Direction direction, int ordinalPosition) {
64
    public JDBCParameter(MetadataElement parent, JDBCValue value, Direction direction, int ordinalPosition) {
65
        this.jdbcProcedure = jdbcProcedure;
65
        this.parent = parent;
66
        this.direction = direction;
66
        this.direction = direction;
67
        this.value = value;
67
        this.value = value;
68
        this.ordinalPosition = ordinalPosition;
68
        this.ordinalPosition = ordinalPosition;
Lines 74-81 Link Here
74
    }
74
    }
75
75
76
    @Override
76
    @Override
77
    public Procedure getParent() {
77
    public MetadataElement getParent() {
78
        return jdbcProcedure.getProcedure();
78
        return parent;
79
    }
79
    }
80
80
81
    @Override
81
    @Override
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCProcedure.java (-4 / +4 lines)
Lines 127-142 Link Here
127
    }
127
    }
128
128
129
    protected JDBCColumn createJDBCColumn(int position, ResultSet rs) throws SQLException {
129
    protected JDBCColumn createJDBCColumn(int position, ResultSet rs) throws SQLException {
130
        return new JDBCColumn(this.getProcedure(), position, JDBCValue.createProcedureValue(rs));
130
        return new JDBCColumn(this.getProcedure(), position, JDBCValue.createProcedureValue(rs, this.getProcedure()));
131
    }
131
    }
132
132
133
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
133
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
134
        Direction direction = JDBCUtils.getDirection(rs.getShort("COLUMN_TYPE"));
134
        Direction direction = JDBCUtils.getProcedureDirection(rs.getShort("COLUMN_TYPE")); //NOI18N
135
        return new JDBCParameter(this, JDBCValue.createProcedureValue(rs), direction, position);
135
        return new JDBCParameter(this.getProcedure(), JDBCValue.createProcedureValue(rs, this.getProcedure()), direction, position);
136
    }
136
    }
137
137
138
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
138
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
139
        return JDBCValue.createProcedureValue(rs);
139
        return JDBCValue.createProcedureValue(rs, this.getProcedure());
140
    }
140
    }
141
141
142
    protected void createProcedureInfo() {
142
    protected void createProcedureInfo() {
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCSchema.java (+48 lines)
Lines 70-75 Link Here
70
    protected Map<String, Table> tables;
70
    protected Map<String, Table> tables;
71
    protected Map<String, View> views;
71
    protected Map<String, View> views;
72
    protected Map<String, Procedure> procedures;
72
    protected Map<String, Procedure> procedures;
73
    protected Map<String, Function> functions;
73
74
74
    public JDBCSchema(JDBCCatalog jdbcCatalog, String name, boolean _default, boolean synthetic) {
75
    public JDBCSchema(JDBCCatalog jdbcCatalog, String name, boolean _default, boolean synthetic) {
75
        this.jdbcCatalog = jdbcCatalog;
76
        this.jdbcCatalog = jdbcCatalog;
Lines 129-134 Link Here
129
    }
130
    }
130
131
131
    @Override
132
    @Override
133
    public Function getFunction(String name) {
134
        return initFunctions().get(name);
135
    }
136
137
    @Override
138
    public Collection<Function> getFunctions() {
139
        return initFunctions().values();
140
    }
141
142
    @Override
132
    public void refresh() {
143
    public void refresh() {
133
        tables = null;
144
        tables = null;
134
        views = null;
145
        views = null;
Lines 148-153 Link Here
148
        return new JDBCProcedure(this, procedureName);
159
        return new JDBCProcedure(this, procedureName);
149
    }
160
    }
150
161
162
    protected JDBCFunction createJDBCFunction(String functionName) {
163
        return new JDBCFunction(this, functionName);
164
    }
165
151
    protected JDBCView createJDBCView(String viewName) {
166
    protected JDBCView createJDBCView(String viewName) {
152
        return new JDBCView(this, viewName);
167
        return new JDBCView(this, viewName);
153
    }
168
    }
Lines 224-229 Link Here
224
        procedures = Collections.unmodifiableMap(newProcedures);
239
        procedures = Collections.unmodifiableMap(newProcedures);
225
    }
240
    }
226
241
242
    protected void createFunctions() {
243
        LOGGER.log(Level.FINE, "Initializing functions in {0}", this); //NOI18N
244
        Map<String, Function> newProcedures = new LinkedHashMap<String, Function>();
245
        try {
246
            ResultSet rs = MetadataUtilities.getFunctions(jdbcCatalog.getJDBCMetadata().getDmd(),
247
                    jdbcCatalog.getName(), name, "%"); // NOI18N
248
            try {
249
                while (rs.next()) {
250
                    String functionName = MetadataUtilities.trimmed(rs.getString("FUNCTION_NAME")); // NOI18N
251
                    Function function = createJDBCFunction(functionName).getFunction();
252
                    newProcedures.put(functionName, function);
253
                    LOGGER.log(Level.FINE, "Created function {0}", function); //NOI18N
254
                }
255
            } finally {
256
                if (rs != null) {
257
                    rs.close();
258
                }
259
            }
260
        } catch (SQLException e) {
261
            throw new MetadataException(e);
262
        }
263
        functions = Collections.unmodifiableMap(newProcedures);
264
    }
265
227
    private Map<String, Table> initTables() {
266
    private Map<String, Table> initTables() {
228
        if (tables != null) {
267
        if (tables != null) {
229
            return tables;
268
            return tables;
Lines 252-255 Link Here
252
        createProcedures();
291
        createProcedures();
253
        return procedures;
292
        return procedures;
254
    }
293
    }
294
295
    private Map<String, Function> initFunctions() {
296
        if (functions != null) {
297
            return functions;
298
        }
299
300
        createFunctions();
301
        return functions;
302
    }
255
}
303
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCTable.java (-2 / +2 lines)
Lines 142-151 Link Here
142
        int position = 0;
142
        int position = 0;
143
        JDBCValue jdbcValue;
143
        JDBCValue jdbcValue;
144
        if (isOdbc(rs)) {
144
        if (isOdbc(rs)) {
145
            jdbcValue = JDBCValue.createTableColumnValueODBC(rs);
145
            jdbcValue = JDBCValue.createTableColumnValueODBC(rs, this.getTable());
146
        } else {
146
        } else {
147
            position = rs.getInt("ORDINAL_POSITION");
147
            position = rs.getInt("ORDINAL_POSITION");
148
            jdbcValue = JDBCValue.createTableColumnValue(rs);
148
            jdbcValue = JDBCValue.createTableColumnValue(rs, this.getTable());
149
        }
149
        }
150
        return new JDBCColumn(this.getTable(), position, jdbcValue);
150
        return new JDBCColumn(this.getTable(), position, jdbcValue);
151
    }
151
    }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCUtils.java (-2 / +16 lines)
Lines 152-158 Link Here
152
        }
152
        }
153
    }
153
    }
154
    
154
    
155
    public static Direction getDirection(short sqlDirection) {
155
    public static Direction getProcedureDirection(short sqlDirection) {
156
        switch (sqlDirection) {
156
        switch (sqlDirection) {
157
            case DatabaseMetaData.procedureColumnOut:
157
            case DatabaseMetaData.procedureColumnOut:
158
                return Direction.OUT;
158
                return Direction.OUT;
Lines 161-167 Link Here
161
            case DatabaseMetaData.procedureColumnIn:
161
            case DatabaseMetaData.procedureColumnIn:
162
                return Direction.IN;
162
                return Direction.IN;
163
            default:
163
            default:
164
                LOGGER.log(Level.INFO, "Unknown direction value from DatabaseMetadat.getProcedureColumns(): " + sqlDirection);
164
                LOGGER.log(Level.INFO, "Unknown direction value from DatabaseMetadata.getProcedureColumns(): " + sqlDirection);
165
                return Direction.IN;
166
        }
167
    }
168
169
    public static Direction getFunctionDirection(short sqlDirection) {
170
        switch (sqlDirection) {
171
            case DatabaseMetaData.functionColumnOut:
172
                return Direction.OUT;
173
            case DatabaseMetaData.functionColumnInOut:
174
                return Direction.INOUT;
175
            case DatabaseMetaData.functionColumnIn:
176
                return Direction.IN;
177
            default:
178
                LOGGER.log(Level.INFO, "Unknown direction value from DatabaseMetadata.getFunctionColumns(): " + sqlDirection);
165
                return Direction.IN;
179
                return Direction.IN;
166
        }
180
        }
167
    }
181
    }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCValue.java (-8 / +23 lines)
Lines 60-65 Link Here
60
60
61
    private static final Logger LOGGER = Logger.getLogger(JDBCValue.class.getName());
61
    private static final Logger LOGGER = Logger.getLogger(JDBCValue.class.getName());
62
62
63
    private final MetadataElement parent;
63
    private final String name;
64
    private final String name;
64
    private final SQLType type;
65
    private final SQLType type;
65
    private final int length;
66
    private final int length;
Lines 75-81 Link Here
75
     * @return a newly created JDBCValue instance
76
     * @return a newly created JDBCValue instance
76
     * @throws java.sql.SQLException
77
     * @throws java.sql.SQLException
77
     */
78
     */
78
    public static JDBCValue createProcedureValue(ResultSet rs) throws SQLException {
79
    public static JDBCValue createProcedureValue(ResultSet rs, MetadataElement parent) throws SQLException {
79
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
80
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
80
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
81
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
81
        int length = rs.getInt("LENGTH");
82
        int length = rs.getInt("LENGTH");
Lines 84-90 Link Here
84
        short radix = rs.getShort("RADIX");
85
        short radix = rs.getShort("RADIX");
85
        Nullable nullable = JDBCUtils.getProcedureNullable(rs.getShort("NULLABLE"));
86
        Nullable nullable = JDBCUtils.getProcedureNullable(rs.getShort("NULLABLE"));
86
87
87
        return new JDBCValue(name, type, length, precision, radix, scale, nullable);
88
        return new JDBCValue(parent, name, type, length, precision, radix, scale, nullable);
89
    }
90
91
    /**
92
     * Create a value from a row in getFunctionColumns()
93
     *
94
     * @param rs the result set from getFunctionColumns, assumed to be at a
95
     * valid row
96
     * @return a newly created JDBCValue instance
97
     * @throws java.sql.SQLException
98
     */
99
    public static JDBCValue createFunctionValue(ResultSet rs, MetadataElement parent) throws SQLException {
100
        // Delegate to the procedure Version - currently the same columns are used
101
        return createProcedureValue(rs, parent);
88
    }
102
    }
89
103
90
    /**
104
    /**
Lines 94-100 Link Here
94
     * @return a newly created JDBCValue instance
108
     * @return a newly created JDBCValue instance
95
     * @throws java.sql.SQLException
109
     * @throws java.sql.SQLException
96
     */
110
     */
97
    public static JDBCValue createTableColumnValue(ResultSet rs) throws SQLException {
111
    public static JDBCValue createTableColumnValue(ResultSet rs, MetadataElement parent) throws SQLException {
98
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
112
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
99
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
113
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
100
114
Lines 112-118 Link Here
112
        short radix = rs.getShort("NUM_PREC_RADIX");
126
        short radix = rs.getShort("NUM_PREC_RADIX");
113
        Nullable nullable = JDBCUtils.getColumnNullable(rs.getShort("NULLABLE"));
127
        Nullable nullable = JDBCUtils.getColumnNullable(rs.getShort("NULLABLE"));
114
128
115
        return new JDBCValue(name, type, length, precision, radix, scale, nullable);
129
        return new JDBCValue(parent, name, type, length, precision, radix, scale, nullable);
116
    }
130
    }
117
131
118
    /**
132
    /**
Lines 123-129 Link Here
123
     * @return a newly created JDBCValue instance
137
     * @return a newly created JDBCValue instance
124
     * @throws java.sql.SQLException
138
     * @throws java.sql.SQLException
125
     */
139
     */
126
    public static JDBCValue createTableColumnValueODBC(ResultSet rs) throws SQLException {
140
    public static JDBCValue createTableColumnValueODBC(ResultSet rs, MetadataElement parent) throws SQLException {
127
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
141
        String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME"));
128
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
142
        SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE"));
129
        int length = 0;
143
        int length = 0;
Lines 137-146 Link Here
137
        short radix = rs.getShort("RADIX");
151
        short radix = rs.getShort("RADIX");
138
        Nullable nullable = JDBCUtils.getColumnNullable(rs.getShort("NULLABLE"));
152
        Nullable nullable = JDBCUtils.getColumnNullable(rs.getShort("NULLABLE"));
139
153
140
        return new JDBCValue(name, type, length, precision, radix, scale, nullable);
154
        return new JDBCValue(parent, name, type, length, precision, radix, scale, nullable);
141
    }
155
    }
142
156
143
    public JDBCValue(String name, SQLType type, int length, int precision, short radix, short scale, Nullable nullable) {
157
    public JDBCValue(MetadataElement parent, String name, SQLType type, int length, int precision, short radix, short scale, Nullable nullable) {
158
        this.parent = parent;
144
        this.name = name;
159
        this.name = name;
145
        this.type = type;
160
        this.type = type;
146
        this.length = length;
161
        this.length = length;
Lines 193-199 Link Here
193
208
194
    @Override
209
    @Override
195
    public MetadataElement getParent() {
210
    public MetadataElement getParent() {
196
        throw new UnsupportedOperationException("Not supported yet.");
211
        return this.parent;
197
    }
212
    }
198
213
199
}
214
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCView.java (-1 / +1 lines)
Lines 99-105 Link Here
99
99
100
    protected JDBCColumn createJDBCColumn(ResultSet rs) throws SQLException {
100
    protected JDBCColumn createJDBCColumn(ResultSet rs) throws SQLException {
101
        int ordinalPosition = rs.getInt("ORDINAL_POSITION");
101
        int ordinalPosition = rs.getInt("ORDINAL_POSITION");
102
        return new JDBCColumn(this.getView(), ordinalPosition, JDBCValue.createTableColumnValue(rs));
102
        return new JDBCColumn(this.getView(), ordinalPosition, JDBCValue.createTableColumnValue(rs, this.getView()));
103
    }
103
    }
104
104
105
    protected void createColumns() {
105
    protected void createColumns() {
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/mysql/MySQLProcedure.java (-5 / +6 lines)
Lines 44-49 Link Here
44
44
45
import java.sql.ResultSet;
45
import java.sql.ResultSet;
46
import java.sql.SQLException;
46
import java.sql.SQLException;
47
import org.netbeans.modules.db.metadata.model.api.MetadataElement;
47
import org.netbeans.modules.db.metadata.model.api.Nullable;
48
import org.netbeans.modules.db.metadata.model.api.Nullable;
48
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
49
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
49
import org.netbeans.modules.db.metadata.model.api.SQLType;
50
import org.netbeans.modules.db.metadata.model.api.SQLType;
Lines 64-76 Link Here
64
65
65
    @Override
66
    @Override
66
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
67
    protected JDBCParameter createJDBCParameter(int position, ResultSet rs) throws SQLException {
67
        Direction direction = JDBCUtils.getDirection(rs.getShort("COLUMN_TYPE"));
68
        Direction direction = JDBCUtils.getProcedureDirection(rs.getShort("COLUMN_TYPE"));
68
        return new JDBCParameter(this, createValue(rs), direction, position);
69
        return new JDBCParameter(this.getProcedure(), createValue(rs, this.getProcedure()), direction, position);
69
    }
70
    }
70
71
71
    @Override
72
    @Override
72
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
73
    protected JDBCValue createJDBCValue(ResultSet rs) throws SQLException {
73
        return createValue(rs);
74
        return createValue(rs, this.getProcedure());
74
    }
75
    }
75
76
76
    @Override
77
    @Override
Lines 85-91 Link Here
85
     * Logged as a MySQL bug - http://bugs.mysql.com/bug.php?id=41269
86
     * Logged as a MySQL bug - http://bugs.mysql.com/bug.php?id=41269
86
     * When this is fixed this workaround will need to be backed out.
87
     * When this is fixed this workaround will need to be backed out.
87
     */
88
     */
88
    private static JDBCValue createValue(ResultSet rs) throws SQLException {
89
    private static JDBCValue createValue(ResultSet rs, MetadataElement parent) throws SQLException {
89
        String name = rs.getString("COLUMN_NAME");
90
        String name = rs.getString("COLUMN_NAME");
90
91
91
        int length = 0;
92
        int length = 0;
Lines 101-107 Link Here
101
        short radix = rs.getShort("RADIX");
102
        short radix = rs.getShort("RADIX");
102
        Nullable nullable = JDBCUtils.getProcedureNullable(rs.getShort("NULLABLE"));
103
        Nullable nullable = JDBCUtils.getProcedureNullable(rs.getShort("NULLABLE"));
103
104
104
        return new JDBCValue(name, type, length, precision, radix, scale, nullable);
105
        return new JDBCValue(parent, name, type, length, precision, radix, scale, nullable);
105
    }
106
    }
106
107
107
108
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/spi/ProcedureImplementation.java (-7 / +7 lines)
Lines 39-66 Link Here
39
 *
39
 *
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
40
 * Portions Copyrighted 2008 Sun Microsystems, Inc.
41
 */
41
 */
42
43
package org.netbeans.modules.db.metadata.model.spi;
42
package org.netbeans.modules.db.metadata.model.spi;
44
43
45
import java.util.Collection;
44
import java.util.Collection;
46
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
45
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
47
import org.netbeans.modules.db.metadata.model.api.Column;
46
import org.netbeans.modules.db.metadata.model.api.Column;
47
import org.netbeans.modules.db.metadata.model.api.Function;
48
import org.netbeans.modules.db.metadata.model.api.Parameter;
48
import org.netbeans.modules.db.metadata.model.api.Parameter;
49
import org.netbeans.modules.db.metadata.model.api.Procedure;
50
import org.netbeans.modules.db.metadata.model.api.Schema;
49
import org.netbeans.modules.db.metadata.model.api.Schema;
51
import org.netbeans.modules.db.metadata.model.api.Value;
50
import org.netbeans.modules.db.metadata.model.api.Value;
52
51
53
/**
52
/**
54
 *
53
 *
55
 * @author Andrei Badea
54
 * @author Andrei Badea, Matthias42
55
 * @since db.metadata.model/1.0
56
 */
56
 */
57
public abstract class ProcedureImplementation {
57
public abstract class FunctionImplementation {
58
58
59
    private Procedure table;
59
    private Function table;
60
60
61
    public final Procedure getProcedure() {
61
    public final Function getFunction() {
62
        if (table == null) {
62
        if (table == null) {
63
            table = MetadataAccessor.getDefault().createProcedure(this);
63
            table = MetadataAccessor.getDefault().createFunction(this);
64
        }
64
        }
65
        return table;
65
        return table;
66
    }
66
    }
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/spi/ParameterImplementation.java (-3 lines)
Lines 45-51 Link Here
45
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
45
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
46
import org.netbeans.modules.db.metadata.model.api.Parameter;
46
import org.netbeans.modules.db.metadata.model.api.Parameter;
47
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
47
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
48
import org.netbeans.modules.db.metadata.model.api.Procedure;
49
48
50
/**
49
/**
51
 *
50
 *
Lines 64-71 Link Here
64
63
65
    public abstract Direction getDirection();
64
    public abstract Direction getDirection();
66
65
67
    public abstract Procedure getParent();
68
69
    public abstract int getOrdinalPosition();
66
    public abstract int getOrdinalPosition();
70
67
71
}
68
}
(-)a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/spi/SchemaImplementation.java (+16 lines)
Lines 43-50 Link Here
43
package org.netbeans.modules.db.metadata.model.spi;
43
package org.netbeans.modules.db.metadata.model.spi;
44
44
45
import java.util.Collection;
45
import java.util.Collection;
46
import java.util.Collections;
46
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
47
import org.netbeans.modules.db.metadata.model.MetadataAccessor;
47
import org.netbeans.modules.db.metadata.model.api.Catalog;
48
import org.netbeans.modules.db.metadata.model.api.Catalog;
49
import org.netbeans.modules.db.metadata.model.api.Function;
48
import org.netbeans.modules.db.metadata.model.api.Procedure;
50
import org.netbeans.modules.db.metadata.model.api.Procedure;
49
import org.netbeans.modules.db.metadata.model.api.Schema;
51
import org.netbeans.modules.db.metadata.model.api.Schema;
50
import org.netbeans.modules.db.metadata.model.api.Table;
52
import org.netbeans.modules.db.metadata.model.api.Table;
Lines 77-82 Link Here
77
79
78
    public abstract Collection<Procedure> getProcedures();
80
    public abstract Collection<Procedure> getProcedures();
79
81
82
    /**
83
     * @since db.metadata.model/1.0
84
     */
85
    public Function getFunction(String name) {
86
        return null;
87
    }
88
89
    /**
90
     * @since db.metadata.model/1.0
91
     */
92
    public Collection<Function> getFunctions() {
93
        return Collections.emptyList();
94
    }
95
80
    public abstract boolean isDefault();
96
    public abstract boolean isDefault();
81
97
82
    public abstract boolean isSynthetic();
98
    public abstract boolean isSynthetic();
(-)a/db.metadata.model/test/unit/src/org/netbeans/modules/db/metadata/model/api/MetadataElementHandleTest.java (-1 / +70 lines)
Lines 44-49 Link Here
44
44
45
import java.sql.Connection;
45
import java.sql.Connection;
46
import java.sql.DriverManager;
46
import java.sql.DriverManager;
47
import java.sql.SQLException;
47
import java.sql.Statement;
48
import java.sql.Statement;
48
import org.netbeans.modules.db.metadata.model.api.MetadataElementHandle.Kind;
49
import org.netbeans.modules.db.metadata.model.api.MetadataElementHandle.Kind;
49
import org.netbeans.modules.db.metadata.model.jdbc.JDBCMetadata;
50
import org.netbeans.modules.db.metadata.model.jdbc.JDBCMetadata;
Lines 74-84 Link Here
74
        stmt.executeUpdate("CREATE TABLE BAR (ID INT NOT NULL PRIMARY KEY, FOO_ID INT NOT NULL, FOREIGN KEY (FOO_ID) REFERENCES FOO)");
75
        stmt.executeUpdate("CREATE TABLE BAR (ID INT NOT NULL PRIMARY KEY, FOO_ID INT NOT NULL, FOREIGN KEY (FOO_ID) REFERENCES FOO)");
75
        stmt.executeUpdate("CREATE INDEX FOO_INDEX ON FOO(FOO)");
76
        stmt.executeUpdate("CREATE INDEX FOO_INDEX ON FOO(FOO)");
76
        stmt.executeUpdate("CREATE VIEW FOOVIEW AS SELECT * FROM FOO");
77
        stmt.executeUpdate("CREATE VIEW FOOVIEW AS SELECT * FROM FOO");
78
        stmt.executeUpdate("CREATE PROCEDURE XY (IN S_MONTH INTEGER, IN S_DAYS VARCHAR(255)) "
79
                + " DYNAMIC RESULT SETS 1 "
80
                + " PARAMETER STYLE JAVA READS SQL  DATA LANGUAGE JAVA "
81
                + " EXTERNAL NAME 'org.netbeans.modules.db.metadata.model.api.MetadataElementHandleTest.demoProcedure'");
82
        stmt.executeUpdate("CREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE "
83
                + "PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA "
84
                + "EXTERNAL NAME 'java.lang.Math.toDegrees'");
77
        stmt.close();
85
        stmt.close();
78
        metadata = new JDBCMetadata(conn, "APP").getMetadata();
86
        metadata = new JDBCMetadata(conn, "APP").getMetadata();
79
    }
87
    }
80
88
81
    public void testResolve() {
89
    public void testResolve() throws SQLException {
82
        Catalog catalog = metadata.getDefaultCatalog();
90
        Catalog catalog = metadata.getDefaultCatalog();
83
        MetadataElementHandle<Catalog> catalogHandle = MetadataElementHandle.create(catalog);
91
        MetadataElementHandle<Catalog> catalogHandle = MetadataElementHandle.create(catalog);
84
            Catalog resolvedCatalog = catalogHandle.resolve(metadata);
92
            Catalog resolvedCatalog = catalogHandle.resolve(metadata);
Lines 120-125 Link Here
120
        View resolvedView = viewHandle.resolve(metadata);
128
        View resolvedView = viewHandle.resolve(metadata);
121
        assertSame(view, resolvedView);
129
        assertSame(view, resolvedView);
122
130
131
        Function function = schema.getFunction("TO_DEGREES");
132
        MetadataElementHandle<Function> procedureHandle = MetadataElementHandle.create(function);
133
        Function resolvedFunction = procedureHandle.resolve(metadata);
134
        assertSame(function, resolvedFunction);
135
136
        assertTrue(function.getParameters().size() > 0);
137
138
        for (Parameter param : function.getParameters()) {
139
            MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(param);
140
            Parameter resolvedParam = paramHandle.resolve(metadata);
141
            assertSame(param, resolvedParam);
142
        }
143
144
        Value value = function.getReturnValue();
145
        assertNotNull(value);
146
        MetadataElementHandle<Value> valueHandle = MetadataElementHandle.create(value);
147
        Value resolvedValue = valueHandle.resolve(metadata);
148
        assertSame(value, resolvedValue);
149
150
        Procedure procedure = schema.getProcedure("XY");
151
        MetadataElementHandle<Procedure> functionHandle = MetadataElementHandle.create(procedure);
152
        Procedure resolvedProcedure = functionHandle.resolve(metadata);
153
        assertSame(procedure, resolvedProcedure);
154
155
        assertTrue(procedure.getParameters().size() > 0);
156
157
        for (Parameter param : procedure.getParameters()) {
158
            MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(param);
159
            Parameter resolvedParam = paramHandle.resolve(metadata);
160
            assertSame(param, resolvedParam);
161
        }
162
163
        value = procedure.getReturnValue();
164
        assertNull(value);
165
166
        // Ensure conflicting names of functions and procudures don't spill over
167
        // a MetadataElementHandle<Parameter> from a procedure must not be
168
        // resolvable against a function with the same "path" (Function name =
169
        // procedure name and same parameter name)
170
        procedure = schema.getProcedure("XY");
171
        MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(procedure.getParameters().iterator().next());
172
        assertNotNull(paramHandle.resolve(metadata));
173
174
        Statement stmt = conn.createStatement();
175
        stmt.executeUpdate("DROP PROCEDURE XY");
176
        stmt.executeUpdate("CREATE FUNCTION XY (S_MONTH INTEGER, S_DAYS VARCHAR(255)) RETURNS DOUBLE "
177
                + " PARAMETER STYLE JAVA READS SQL  DATA LANGUAGE JAVA "
178
                + " EXTERNAL NAME 'org.netbeans.modules.db.metadata.model.api.MetadataElementHandleTest.demoProcedure'");
179
        stmt.close();
180
181
        metadata.refresh();
182
183
        schema = metadata.getDefaultSchema();
184
185
        assertNotNull(schema.getFunction("XY"));
186
187
        assertNull(schema.getProcedure("XY"));
188
189
        assertNull(paramHandle.resolve(metadata));
190
191
123
        // Negative test - what happens if you create a handle for null
192
        // Negative test - what happens if you create a handle for null
124
        try {
193
        try {
125
            MetadataElementHandle<Catalog> bogusHandle = MetadataElementHandle.create((Catalog)null);
194
            MetadataElementHandle<Catalog> bogusHandle = MetadataElementHandle.create((Catalog)null);

Return to bug 156304