@@ -74,7 +74,7 @@ class PostgreSQLConnection
74
74
private var recentError = false
75
75
private val queryPromiseReference = new AtomicReference [Option [Promise [QueryResult ]]](None )
76
76
private var currentQuery : Option [MutableResultSet [PostgreSQLColumnData ]] = None
77
- private var currentPreparedStatement : Option [String ] = None
77
+ private var currentPreparedStatement : Option [PreparedStatementHolder ] = None
78
78
private var version = Version (0 ,0 ,0 )
79
79
80
80
private var queryResult : Option [QueryResult ] = None
@@ -106,61 +106,31 @@ class PostgreSQLConnection
106
106
promise.future
107
107
}
108
108
109
- private def prepareQueryParams (query : String ) : (String , Int ) = {
110
- val result = new StringBuilder (query.length+ 16 )
111
- var offset = 0
112
- var params = 0
113
- while (offset < query.length) {
114
- val next = query.indexOf('?' , offset)
115
- if (next == - 1 ) {
116
- result ++= query.substring(offset)
117
- offset = query.length
118
- } else {
119
- result ++= query.substring(offset, next)
120
- offset = next + 1
121
- if (offset < query.length && query(offset) == '?' ) {
122
- result += '?'
123
- offset += 1
124
- } else {
125
- result += '$'
126
- params += 1
127
- result ++= params.toString
128
- }
129
- }
130
- }
131
- (result.toString, params)
132
- }
133
-
134
109
override def sendPreparedStatement (query : String , values : Seq [Any ] = List ()): Future [QueryResult ] = {
135
110
validateQuery(query)
136
111
137
- val (realQuery, paramsCount) = prepareQueryParams(query)
138
-
139
- if (paramsCount != values.length) {
140
- throw new InsufficientParametersException (paramsCount, values)
141
- }
142
-
143
112
val promise = Promise [QueryResult ]()
144
113
this .setQueryPromise(promise)
145
- this .currentPreparedStatement = Some (query)
146
114
147
- this .isParsed(query) match {
148
- case Some (holder) => {
149
- this .currentQuery = Some (new MutableResultSet (holder.columnDatas))
150
- write(new PreparedStatementExecuteMessage (holder.statementId, realQuery, values, this .encoderRegistry))
151
- }
152
- case None => {
153
- val statementId = this .preparedStatementsCounter.incrementAndGet()
154
- this .parsedStatements.put( query, new PreparedStatementHolder ( statementId ) )
155
- write(new PreparedStatementOpeningMessage (statementId, realQuery, values, this .encoderRegistry))
156
- }
115
+ val holder = this .parsedStatements.getOrElseUpdate(query,
116
+ new PreparedStatementHolder ( query, preparedStatementsCounter.incrementAndGet ))
117
+
118
+ if (holder.paramsCount != values.length) {
119
+ this .clearQueryPromise
120
+ throw new InsufficientParametersException (holder.paramsCount, values)
157
121
}
158
122
159
- promise.future
160
- }
123
+ this .currentPreparedStatement = Some (holder)
124
+ this .currentQuery = Some (new MutableResultSet (holder.columnDatas))
125
+ write(
126
+ if (holder.prepared)
127
+ new PreparedStatementExecuteMessage (holder.statementId, holder.realQuery, values, this .encoderRegistry)
128
+ else {
129
+ holder.prepared = true
130
+ new PreparedStatementOpeningMessage (holder.statementId, holder.realQuery, values, this .encoderRegistry)
131
+ })
161
132
162
- private def isParsed (query : String ): Option [PreparedStatementHolder ] = {
163
- this .parsedStatements.get(query)
133
+ promise.future
164
134
}
165
135
166
136
override def onError ( exception : Throwable ) {
@@ -234,8 +204,7 @@ class PostgreSQLConnection
234
204
}
235
205
236
206
private def setColumnDatas ( columnDatas : Array [PostgreSQLColumnData ] ) {
237
- if (this .currentPreparedStatement.isDefined) {
238
- val holder = this .parsedStatements(this .currentPreparedStatement.get)
207
+ this .currentPreparedStatement.foreach { holder =>
239
208
holder.columnDatas = columnDatas
240
209
}
241
210
}
0 commit comments