Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-r2dbc</artifactId>
<version>1.0.0.BUILD-SNAPSHOT</version>
<version>1.0.0.gh-75-SNAPSHOT</version>

<name>Spring Data R2DBC</name>
<description>Spring Data module for R2DBC.</description>
Expand All @@ -31,6 +31,8 @@
<degraph-check.version>0.1.4</degraph-check.version>
<hsqldb.version>2.4.1</hsqldb.version>
<postgresql.version>42.2.5</postgresql.version>
<mysql.version>5.1.47</mysql.version>
<jasync.version>0.9.38</jasync.version>
<mssql-jdbc.version>7.1.2.jre8-preview</mssql-jdbc.version>
<r2dbc-releasetrain.version>Arabba-M7</r2dbc-releasetrain.version>
<reactive-streams.version>1.0.1</reactive-streams.version>
Expand Down Expand Up @@ -173,6 +175,13 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
Expand All @@ -198,6 +207,13 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.github.jasync-sql</groupId>
<artifactId>jasync-r2dbc-mysql</artifactId>
<version>${jasync.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>de.schauderhaft.degraph</groupId>
<artifactId>degraph-check</artifactId>
Expand Down Expand Up @@ -295,7 +311,8 @@
<querydslVersion>${querydsl}</querydslVersion>
<springVersion>${spring}</springVersion>
<r2dbcVersion>${r2dbc-spi.version}</r2dbcVersion>
<reactiveStreamsVersion>${reactive-streams.version}</reactiveStreamsVersion>
<reactiveStreamsVersion>${reactive-streams.version}
</reactiveStreamsVersion>
<releasetrainVersion>${releasetrain}</releasetrainVersion>
<allow-uri-read>true</allow-uri-read>
<toclevels>3</toclevels>
Expand Down Expand Up @@ -416,6 +433,10 @@
<id>spring-libs-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
<repository>
<id>jcenter</id>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>

<pluginRepositories>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.r2dbc.dialect;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
* Anonymous, index-based bind marker using a static placeholder. Instances are bound by the ordinal position ordered by
* the appearance of the placeholder. This implementation creates indexed bind markers using an anonymous placeholder
* that correlates with an index.
*
* @author Mark Paluch
*/
class AnonymousBindMarkers implements BindMarkers {

private static final AtomicIntegerFieldUpdater<AnonymousBindMarkers> COUNTER_INCREMENTER = AtomicIntegerFieldUpdater
.newUpdater(AnonymousBindMarkers.class, "counter");

// access via COUNTER_INCREMENTER
@SuppressWarnings("unused") private volatile int counter;

private final String placeholder;

/**
* Creates a new {@link AnonymousBindMarkers} instance given {@code placeholder}.
*
* @param placeholder parameter bind marker.
*/
AnonymousBindMarkers(String placeholder) {
this.counter = 0;
this.placeholder = placeholder;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarkers#next()
*/
@Override
public BindMarker next() {

int index = COUNTER_INCREMENTER.getAndIncrement(this);

return new IndexedBindMarker(placeholder, index);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,22 @@ static BindMarkersFactory indexed(String prefix, int beginWith) {
return () -> new IndexedBindMarkers(prefix, beginWith);
}

/**
* Creates anonymous, index-based bind marker using a static placeholder. Instances are bound by the ordinal position
* ordered by the appearance of the placeholder. This implementation creates indexed bind markers using an anonymous
* placeholder that correlates with an index.
*
* @param placeholder parameter placeholder.
* @return a {@link BindMarkersFactory} using {@code placeholder}.
* @see io.r2dbc.spi.Statement#bindNull(int, Class)
* @see io.r2dbc.spi.Statement#bind(int, Object)
*/
static BindMarkersFactory anonymous(String placeholder) {

Assert.hasText(placeholder, "Placeholder must not be empty!");
return () -> new AnonymousBindMarkers(placeholder);
}

/**
* Create named {@link BindMarkers} using identifiers to bind parameters. Named bind markers can support
* {@link BindMarkers#next(String) name hints}. If no {@link BindMarkers#next(String) hint} is given, named bind
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/org/springframework/data/r2dbc/dialect/Database.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@ public String driverName() {
public Dialect defaultDialect() {
return H2Dialect.INSTANCE;
}
},

MYSQL {
@Override
public String driverName() {
return "MySQL";
}

@Override
public Dialect defaultDialect() {
return MySqlDialect.INSTANCE;
}
};

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.r2dbc.dialect;

import io.r2dbc.spi.Statement;

/**
* A single indexed bind marker.
*/
class IndexedBindMarker implements BindMarker {

private final String placeholder;

private int index;

IndexedBindMarker(String placeholder, int index) {
this.placeholder = placeholder;
this.index = index;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#getPlaceholder()
*/
@Override
public String getPlaceholder() {
return placeholder;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#bindValue(io.r2dbc.spi.Statement, java.lang.Object)
*/
@Override
public void bind(Statement statement, Object value) {
statement.bind(this.index, value);
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#bindNull(io.r2dbc.spi.Statement, java.lang.Class)
*/
@Override
public void bindNull(Statement statement, Class<?> valueType) {
statement.bindNull(this.index, valueType);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.springframework.data.r2dbc.dialect;

import io.r2dbc.spi.Statement;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
Expand Down Expand Up @@ -45,46 +43,4 @@ public BindMarker next() {

return new IndexedBindMarker(prefix + "" + (index + offset), index);
}

/**
* A single indexed bind marker.
*/
static class IndexedBindMarker implements BindMarker {

private final String placeholder;

private int index;

IndexedBindMarker(String placeholder, int index) {
this.placeholder = placeholder;
this.index = index;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#getPlaceholder()
*/
@Override
public String getPlaceholder() {
return placeholder;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#bindValue(io.r2dbc.spi.Statement, java.lang.Object)
*/
@Override
public void bind(Statement statement, Object value) {
statement.bind(this.index, value);
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.BindMarker#bindNull(io.r2dbc.spi.Statement, java.lang.Class)
*/
@Override
public void bindNull(Statement statement, Class<?> valueType) {
statement.bindNull(this.index, valueType);
}
}
}
109 changes: 109 additions & 0 deletions src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.r2dbc.dialect;

import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

/**
* An SQL dialect for MySQL.
*
* @author Mark Paluch
*/
public class MySqlDialect implements Dialect {

private static final Set<Class<?>> SIMPLE_TYPES = new HashSet<>(
Arrays.asList(UUID.class, URL.class, URI.class, InetAddress.class));

/**
* Singleton instance.
*/
public static final MySqlDialect INSTANCE = new MySqlDialect();

private static final BindMarkersFactory ANONYMOUS = BindMarkersFactory.anonymous("?");

private static final LimitClause LIMIT_CLAUSE = new LimitClause() {

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long, long)
*/
@Override
public String getClause(long limit, long offset) {
return String.format("LIMIT %d,%d", limit, offset);
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long)
*/
@Override
public String getClause(long limit) {
return "LIMIT " + limit;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClausePosition()
*/
@Override
public Position getClausePosition() {
return Position.END;
}
};

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.Dialect#getBindMarkersFactory()
*/
@Override
public BindMarkersFactory getBindMarkersFactory() {
return ANONYMOUS;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.Dialect#getSimpleTypesKeys()
*/
@Override
public Collection<? extends Class<?>> getSimpleTypes() {
return SIMPLE_TYPES;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.Dialect#limit()
*/
@Override
public LimitClause limit() {
return LIMIT_CLAUSE;
}

/*
* (non-Javadoc)
* @see org.springframework.data.r2dbc.dialect.Dialect#getArraySupport()
*/
@Override
public ArrayColumns getArraySupport() {
return ArrayColumns.Unsupported.INSTANCE;
}
}
Loading