Skip to content

Commit dc85848

Browse files
authored
Merge pull request #20 from tldyl/patch
Added id field to jdbc-adapter. Fixed an error.
2 parents 49333df + 1af249e commit dc85848

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ services:
2020

2121
before_install:
2222
- mysql -e 'CREATE DATABASE casbin;'
23+
- mysql -e "CREATE USER 'casbin_test'@'localhost' IDENTIFIED BY 'TEST_casbin';"
24+
- mysql -e "GRANT ALL ON casbin.* TO 'casbin_test'@'localhost';"
2325
- psql -c 'CREATE DATABASE casbin;' -U postgres
26+
- psql -c "CREATE USER casbin_test WITH PASSWORD 'TEST_casbin';" -U postgres

src/main/java/org/casbin/adapter/JDBCAdapter.java

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import org.casbin.jcasbin.persist.Helper;
2222

2323
import javax.sql.DataSource;
24+
import java.math.BigDecimal;
2425
import java.sql.*;
2526
import java.util.*;
2627

2728
class CasbinRule {
29+
int id; //Fields reserved for compatibility with other adapters, and the primary key is automatically incremented.
2830
String ptype;
2931
String v0;
3032
String v1;
@@ -40,6 +42,7 @@ class CasbinRule {
4042
*/
4143
public class JDBCAdapter implements Adapter {
4244
private DataSource dataSource = null;
45+
private final int batchSize = 1000;
4346

4447
/**
4548
* JDBCAdapter is the constructor for JDBCAdapter.
@@ -65,19 +68,61 @@ public JDBCAdapter(DataSource dataSource) throws Exception {
6568

6669
private void migrate() throws SQLException {
6770
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) {
68-
String sql = "CREATE TABLE IF NOT EXISTS casbin_rule(ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))";
71+
String sql = "CREATE TABLE IF NOT EXISTS casbin_rule(id int NOT NULL PRIMARY KEY auto_increment, ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))";
6972
String productName = conn.getMetaData().getDatabaseProductName();
7073

7174
switch (productName) {
72-
case "Oracle": {
73-
sql = "declare begin execute immediate 'CREATE TABLE CASBIN_RULE(ptype VARCHAR(100) not NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))'; exception when others then if SQLCODE = -955 then null; else raise; end if; end;";
74-
}
75-
case "Microsoft SQL Server": {
76-
sql = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='casbin_rule' and xtype='U') CREATE TABLE casbin_rule(ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))";
77-
}
75+
case "Oracle":
76+
sql = "declare begin execute immediate 'CREATE TABLE CASBIN_RULE(id NUMBER(5, 0) not NULL primary key, ptype VARCHAR(100) not NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))'; " +
77+
"exception when others then " +
78+
"if SQLCODE = -955 then " +
79+
"null; " +
80+
"else raise; " +
81+
"end if; " +
82+
"end;";
83+
break;
84+
case "Microsoft SQL Server":
85+
sql = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='casbin_rule' and xtype='U') CREATE TABLE casbin_rule(id int NOT NULL primary key identity(1, 1), ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))";
86+
break;
87+
case "PostgreSQL":
88+
sql = "CREATE SEQUENCE IF NOT EXISTS CASBIN_SEQUENCE START 1;";
89+
break;
7890
}
7991

8092
stmt.executeUpdate(sql);
93+
if (productName.equals("Oracle")) {
94+
sql = "declare " +
95+
"V_NUM number;" +
96+
"BEGIN " +
97+
"V_NUM := 0; " +
98+
"select count(0) into V_NUM from user_sequences where sequence_name = 'CASBIN_SEQUENCE';" +
99+
"if V_NUM > 0 then " +
100+
"null;" +
101+
"else " +
102+
"execute immediate 'CREATE SEQUENCE casbin_sequence increment by 1 start with 1 nomaxvalue nocycle nocache';" +
103+
"end if;END;";
104+
stmt.executeUpdate(sql);
105+
sql = "declare " +
106+
"V_NUM number;" +
107+
"BEGIN " +
108+
"V_NUM := 0;" +
109+
"select count(0) into V_NUM from user_triggers where trigger_name = 'CASBIN_ID_AUTOINCREMENT';" +
110+
"if V_NUM > 0 then " +
111+
"null;" +
112+
"else " +
113+
"execute immediate 'create trigger casbin_id_autoincrement before "+
114+
" insert on CASBIN_RULE for each row "+
115+
" when (new.id is null) "+
116+
" begin "+
117+
" select casbin_sequence.nextval into:new.id from dual;"+
118+
" end;';" +
119+
"end if;" +
120+
"END;";
121+
stmt.executeUpdate(sql);
122+
} else if (productName.equals("PostgreSQL")) {
123+
sql = "CREATE TABLE IF NOT EXISTS casbin_rule(id int NOT NULL PRIMARY KEY default nextval('CASBIN_SEQUENCE'::regclass), ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))";
124+
stmt.executeUpdate(sql);
125+
}
81126
}
82127
}
83128

@@ -117,19 +162,19 @@ public void loadPolicy(Model model) {
117162
while (rSet.next()) {
118163
CasbinRule line = new CasbinRule();
119164
for (int i = 1; i <= rData.getColumnCount(); i++) {
120-
if (i == 1) {
165+
if (i == 2) {
121166
line.ptype = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
122-
} else if (i == 2) {
123-
line.v0 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
124167
} else if (i == 3) {
125-
line.v1 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
168+
line.v0 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
126169
} else if (i == 4) {
127-
line.v2 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
170+
line.v1 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
128171
} else if (i == 5) {
129-
line.v3 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
172+
line.v2 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
130173
} else if (i == 6) {
131-
line.v4 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
174+
line.v3 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
132175
} else if (i == 7) {
176+
line.v4 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
177+
} else if (i == 8) {
133178
line.v5 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
134179
}
135180
}
@@ -179,12 +224,10 @@ public void savePolicy(Model model) {
179224
try (Connection conn = dataSource.getConnection()) {
180225
conn.setAutoCommit(false);
181226

182-
final int batchSize = 1000;
183227
int count = 0;
184228

185229
try (Statement statement = conn.createStatement(); PreparedStatement ps = conn.prepareStatement(addSql)) {
186230
statement.execute(cleanSql);
187-
188231
for (Map.Entry<String, Assertion> entry : model.model.get("p").entrySet()) {
189232
String ptype = entry.getKey();
190233
Assertion ast = entry.getValue();

src/test/java/org/casbin/adapter/AdapterCreator.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ public interface AdapterCreator {
2525
JDBCAdapter createViaDataSource() throws Exception;
2626
}
2727

28-
2928
class MySQLAdapterCreator implements AdapterCreator {
30-
private String url = "jdbc:mysql://localhost:3306/casbin";
31-
private String username = "root";
32-
private String password = "";
29+
private String url = "jdbc:mysql://localhost:3306/casbin?serverTimezone=GMT%2B8";
30+
private String username = "casbin_test";
31+
private String password = "TEST_casbin";
3332
private String driver = "com.mysql.cj.jdbc.Driver";
3433

3534
@Override
@@ -48,7 +47,6 @@ public JDBCAdapter createViaDataSource() throws Exception {
4847
}
4948
}
5049

51-
5250
class OracleAdapterCreator implements AdapterCreator {
5351
private String url = "jdbc:oracle:thin:@//localhost:1521/orcl";
5452
private String username = "system";

0 commit comments

Comments
 (0)