diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..b1f0c40 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,32 @@ +name: Publish + +on: push +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'zulu' + server-id: github + settings-path: ${{ github.workspace }} + + - name: Run chmod to make gradlew executable + run: chmod +x ./gradlew + + - name: Build with Gradle + uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 + with: + arguments: bootJar + - name: Deploy to prod + env: + deployUser: ${{ secrets.CLOJARS_USER }} + deployToken: ${{ secrets.CLOJARS_TOKEN }} + run: | + sshpass -v -p ${{ secrets.DEPLOY_PASSWORD }} scp -o StrictHostKeyChecking=no -P ${{ secrets.DEPLOY_PORT }} ${{ github.workspace }}/build/libs/backend.jar ${{ secrets.DEPLOY_USERNAME }}@${{ secrets.DEPLOY_HOST }}:/home/dynomake/vpn/ \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2266f6b..fae6c8e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index d44ef08..4efc062 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'io.github.dynomake' -version '1.0.2' +version '1.0.4' tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } @@ -24,14 +24,15 @@ dependencies { testImplementation group: 'mysql', name: 'mysql-connector-java', version: '5.1.47' } + publishing { repositories { maven { name = "clojars" url = uri("https://clojars.org/repo") credentials { - username = clojarsUserName - password = clojarsDeployToken + username = "$System.env.deployUser" + password = "$System.env.deployToken" } } diff --git a/src/main/java/net/wonsi/api/table/WonsiTable.java b/src/main/java/net/wonsi/api/table/WonsiTable.java index 8722152..cfb18c6 100644 --- a/src/main/java/net/wonsi/api/table/WonsiTable.java +++ b/src/main/java/net/wonsi/api/table/WonsiTable.java @@ -11,6 +11,7 @@ public interface WonsiTable { DeleteRequest delete(); UpdateRequest update(); + String getName(); ExecutedReturningAction customSelect(@NonNull String query); Request customQuery(@NonNull String query); diff --git a/src/main/java/net/wonsi/column/type/IntType.java b/src/main/java/net/wonsi/column/type/IntType.java index 0d7e341..48acaa7 100644 --- a/src/main/java/net/wonsi/column/type/IntType.java +++ b/src/main/java/net/wonsi/column/type/IntType.java @@ -5,7 +5,7 @@ public class IntType implements ColumnType { @Override public String convertToString(int length) { if (length <= 5) return "tinyint"; - if (length <= 6) return "mediumint"; + if (length == 6) return "mediumint"; if (length < 10) return "int"; else return "bigint"; } diff --git a/src/main/java/net/wonsi/proxy/request/RealInsertRequest.java b/src/main/java/net/wonsi/proxy/request/RealInsertRequest.java index 0df59da..9d2f6ec 100644 --- a/src/main/java/net/wonsi/proxy/request/RealInsertRequest.java +++ b/src/main/java/net/wonsi/proxy/request/RealInsertRequest.java @@ -1,6 +1,7 @@ package net.wonsi.proxy.request; import com.google.common.base.Joiner; +import lombok.val; import net.wonsi.api.request.InsertRequest; import net.wonsi.util.ExecutorUtil; import net.wonsi.util.StringUtil; @@ -20,12 +21,15 @@ public class RealInsertRequest implements InsertRequest { private int limit; private boolean fixDuplicate; private Map data; + private final String primaryKeyName; - public RealInsertRequest(Connection connection, String tableName) { + public RealInsertRequest(Connection connection, String tableName, String primaryKeyName) { this.connection = connection; this.tableName = tableName; + this.primaryKeyName = primaryKeyName; condition = "1"; limit = 10; + } @Override @@ -58,7 +62,14 @@ public CompletableFuture async() { @Override public void sync() { try { - PreparedStatement statement = connection.prepareStatement("INSERT INTO " + tableName + " (" + Joiner.on(",").join(data.keySet()) + ") VALUES (" + StringUtil.repeat(",?", data.size()).replaceFirst(",", "")+ ")" + (fixDuplicate ? " ON DUPLICATE KEY UPDATE " + Joiner.on("= ?,").join(data.keySet()) + " = ?" : "")); + val mapWithoutPrimary = new HashMap<>(data); + if (fixDuplicate) { + mapWithoutPrimary.remove(primaryKeyName); + } + val end = (fixDuplicate ? " ON DUPLICATE KEY UPDATE " + Joiner.on("= ?,").join(mapWithoutPrimary.keySet()) + " = ?" : ""); + val query = "INSERT INTO " + tableName + " (" + Joiner.on(",").join(data.keySet()) + ") VALUES (" + StringUtil.repeat(",?", data.size()).replaceFirst(",", "")+ ")" + end; +// System.out.println(query); + PreparedStatement statement = connection.prepareStatement(query); int currentArgument = 1; @@ -69,7 +80,7 @@ public void sync() { if (fixDuplicate){ // currentArgument = currentArgument-2; - for (Object o : data.values()) { + for (Object o : mapWithoutPrimary.values()) { statement.setObject(currentArgument, o); currentArgument++; } diff --git a/src/main/java/net/wonsi/proxy/table/RealWonsiTable.java b/src/main/java/net/wonsi/proxy/table/RealWonsiTable.java index 82f31bc..607db41 100644 --- a/src/main/java/net/wonsi/proxy/table/RealWonsiTable.java +++ b/src/main/java/net/wonsi/proxy/table/RealWonsiTable.java @@ -1,7 +1,8 @@ package net.wonsi.proxy.table; -import lombok.AllArgsConstructor; import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.val; import net.wonsi.api.mapping.WonsiColumn; import net.wonsi.api.mapping.WonsiPrimary; import net.wonsi.api.request.*; @@ -23,12 +24,13 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Function; -@AllArgsConstructor +@RequiredArgsConstructor public class RealWonsiTable implements WonsiTable { - private Connection connection; - private Function deserializer; - private String tableName; + private final Connection connection; + private final Function deserializer; + private final String tableName; + private String primaryKeyName; @Override public SelectRequest select() { @@ -37,7 +39,7 @@ public SelectRequest select() { @Override public InsertRequest insert() { - return new RealInsertRequest(connection, tableName); + return new RealInsertRequest(connection, tableName, primaryKeyName); } @Override @@ -50,6 +52,11 @@ public UpdateRequest update() { return new RealUpdateRequest(connection, tableName); } + @Override + public String getName() { + return tableName; + } + @Override public ExecutedReturningAction customSelect(@NonNull String query) { return new RealExecutedReturningAction(ExecutorUtil.getResult(query, connection), deserializer); @@ -76,7 +83,10 @@ public void createIfNotExits(Class tclass) { for (Field field : tclass.getDeclaredFields()) { WonsiColumn column = field.getAnnotation(WonsiColumn.class); - arguments.add(column.name() + ' ' + ColumnUtil.get(field.getType()).convertToString(column.length()) + (field.getAnnotation(WonsiPrimary.class) != null ? " PRIMARY KEY" : "")); + val primary = (field.getAnnotation(WonsiPrimary.class) != null ? " PRIMARY KEY" : ""); + arguments.add(column.name() + ' ' + ColumnUtil.get(field.getType()).convertToString(column.length()) + primary); + if (!primary.isEmpty()) + primaryKeyName = column.name(); } StringBuilder query = new StringBuilder("CREATE TABLE IF NOT EXISTS `"); diff --git a/src/main/java/net/wonsi/util/Condition.java b/src/main/java/net/wonsi/util/Condition.java index c5c8bb7..3221a6f 100644 --- a/src/main/java/net/wonsi/util/Condition.java +++ b/src/main/java/net/wonsi/util/Condition.java @@ -10,7 +10,10 @@ public class Condition { private String condition; public static Condition is(@NonNull String column, @NonNull Object value) { - return new Condition('`' + column + '`' + " = " + value); + if (value instanceof String) + return new Condition(column + " = " + "'" + value + "'"); + + return new Condition(column + " = " + value); } public static Condition over(@NonNull String column, @NonNull Object value) {