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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ jdbc:ascendix:salesforce://;sessionId=uniqueIdAssociatedWithTheSession
1. Queries support native SOQL;
2. Nested queries are supported;
3. Request caching support on local drive. Caching supports 2 modes: global and session. Global mode means that the cached result will be accessible for all system users for certain JVM session. Session cache mode works for each Salesforce connection session separately. Both modes cache stores request result while JVM still running but no longer than for 1 hour. The cache mode can be enabled with a prefix of SOQL query. How to use:
=======
* Global cache mode:
```SQL
CACHE GLOBAL SELECT Id, Name FROM Account
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,17 @@
@Slf4j
public class ForceDriver implements Driver {

private static final String SF_JDBC_DRIVER_NAME = "SF JDBC driver";
private static final Logger logger = Logger.getLogger(SF_JDBC_DRIVER_NAME);

private static final String ACCEPTABLE_URL = "jdbc:ascendix:salesforce";
private static final Pattern URL_PATTERN = Pattern.compile("\\A" + ACCEPTABLE_URL + "://(.*)");
private static final Pattern URL_HAS_AUTHORIZATION_SEGMENT = Pattern.compile("\\A" + ACCEPTABLE_URL + "://([^:]+):([^@]+)@([^?]*)([?](.*))?");
private static final Pattern PARAM_STANDARD_PATTERN = Pattern.compile("(([^=]+)=([^&]*)&?)");

static {
try {
logger.info("[ForceDriver] registration");
DriverManager.registerDriver(new ForceDriver());
} catch (Exception e) {
throw new RuntimeException("Failed register ForceDriver: " + e.getMessage(), e);
Expand All @@ -58,6 +62,7 @@ public Connection connect(String url, Properties properties) throws SQLException
info.setUserName(properties.getProperty("user"));
info.setClientName(properties.getProperty("client"));
info.setPassword(properties.getProperty("password"));
info.setClientName(properties.getProperty("client"));
info.setSessionId(properties.getProperty("sessionId"));
info.setSandbox(resolveSandboxProperty(properties));
info.setHttps(resolveBooleanProperty(properties, "https", true));
Expand Down Expand Up @@ -99,8 +104,7 @@ private static String resolveStringProperty(Properties properties, String proper
return defaultValue;
}


protected Properties getConnStringProperties(String urlString) throws IOException {
protected static Properties getConnStringProperties(String urlString) throws IOException {
Properties result = new Properties();
String urlProperties = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public DatabaseMetaData getMetaData() {

@Override
public PreparedStatement prepareStatement(String soql) {
logger.info("[Conn] prepareStatement IMPLEMENTED "+soql);
return new ForcePreparedStatement(this, soql);
}

Expand Down Expand Up @@ -77,7 +78,7 @@ public boolean isWrapperFor(Class<?> iface) {
@Override
public Statement createStatement() {
logger.info("[Conn] createStatement 1 IMPLEMENTED ");
return null;
return new ForcePreparedStatement(this);
}

@Override
Expand All @@ -100,26 +101,22 @@ public void setAutoCommit(boolean autoCommit) {

@Override
public boolean getAutoCommit() throws SQLException {
// TODO Auto-generated method stub
return false;
return true;
}

@Override
public void commit() throws SQLException {
// TODO Auto-generated method stub

logger.info("[Conn] commit NOT_IMPLEMENTED ");
}

@Override
public void rollback() throws SQLException {
// TODO Auto-generated method stub

logger.info("[Conn] rollback NOT_IMPLEMENTED ");
}

@Override
public void close() throws SQLException {
// TODO Auto-generated method stub

logger.info("[Conn] close NOT_IMPLEMENTED ");
}

@Override
Expand All @@ -143,13 +140,13 @@ public boolean isReadOnly() throws SQLException {
@Override
public void setCatalog(String catalog) throws SQLException {
// TODO Auto-generated method stub

logger.info("[Conn] setCatalog NOT_IMPLEMENTED set to '"+catalog+"'");
}

@Override
public String getCatalog() throws SQLException {
// TODO Auto-generated method stub
return null;
logger.info("[Conn] getCatalog IMPLEMENTED returning "+ForceDatabaseMetaData.DEFAULT_CATALOG);
return ForceDatabaseMetaData.DEFAULT_CATALOG;
}

@Override
Expand Down Expand Up @@ -178,26 +175,26 @@ public void clearWarnings() throws SQLException {

@Override
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
return null;
logger.info("[Conn] createStatement 2 IMPLEMENTED");
return new ForcePreparedStatement(this);
}

@Override
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
return null;
logger.info("[Conn] prepareStatement 1 IMPLEMENTED "+sql);
return new ForcePreparedStatement(this, sql);
}

@Override
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareCall NOT_IMPLEMENTED "+sql);
return null;
}

@Override
public Map<String, Class<?>> getTypeMap() throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] getTypeMap NOT_IMPLEMENTED ");
return null;
}

Expand Down Expand Up @@ -233,52 +230,52 @@ public Savepoint setSavepoint(String name) throws SQLException {

@Override
public void rollback(Savepoint savepoint) throws SQLException {
// TODO Auto-generated method stub
logger.info("[Conn] rollback Savepoint NOT_IMPLEMENTED");

}

@Override
public void releaseSavepoint(Savepoint savepoint) throws SQLException {
// TODO Auto-generated method stub
logger.info("[Conn] releaseSavepoint NOT_IMPLEMENTED");

}

@Override
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
return null;
logger.info("[Conn] createStatement 3 NOT_IMPLEMENTED");
return new ForcePreparedStatement(this);
}

@Override
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareStatement 2 NOT_IMPLEMENTED "+sql );
return null;
}

@Override
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareCall 2 NOT_IMPLEMENTED "+sql );
return null;
}

@Override
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareStatement 3 NOT_IMPLEMENTED "+sql );
return null;
}

@Override
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareStatement 4 NOT_IMPLEMENTED "+sql );
return null;
}

@Override
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
Logger.getLogger(SF_JDBC_DRIVER_NAME).info(Object.class.getEnclosingMethod().getName());
logger.info("[Conn] prepareStatement 5 NOT_IMPLEMENTED "+sql );
return null;
}

Expand Down Expand Up @@ -309,7 +306,8 @@ public SQLXML createSQLXML() throws SQLException {
@Override
public boolean isValid(int timeout) throws SQLException {
// TODO Auto-generated method stub
return false;
logger.info("[Conn] isValid NOT_IMPLEMENTED ");
return true;
}

@Override
Expand Down Expand Up @@ -352,7 +350,7 @@ public Struct createStruct(String typeName, Object[] attributes) throws SQLExcep
@Override
public void setSchema(String schema) throws SQLException {
// TODO Auto-generated method stub

logger.info("[Conn] setSchema NOT_IMPLEMENTED ");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import java.util.stream.Collectors;

public class PartnerService {

private static final String SF_JDBC_DRIVER_NAME = "SF JDBC driver";
private static final Logger logger = Logger.getLogger(SF_JDBC_DRIVER_NAME);

private PartnerConnection partnerConnection;
private List<String> sObjectTypesCache;

Expand All @@ -31,17 +35,22 @@ public PartnerService(PartnerConnection partnerConnection) {
}

public List<Table> getTables() {
logger.info("[PartnerService] getTables IMPLEMENTED ");
List<DescribeSObjectResult> sObjects = getSObjectsDescription();
return sObjects.stream()
List<Table> tables = sObjects.stream()
.map(this::convertToTable)
.collect(Collectors.toList());
logger.info("[PartnerService] getTables tables count="+tables.size());
return tables;
}

public DescribeSObjectResult describeSObject(String sObjectType) throws ConnectionException {
logger.info("[PartnerService] describeSObject "+sObjectType);
return partnerConnection.describeSObject(sObjectType);
}

private Table convertToTable(DescribeSObjectResult so) {
logger.info("[PartnerService] convertToTable "+so.getName());
List<Field> fields = Arrays.asList(so.getFields());
List<Column> columns = fields.stream()
.map(this::convertToColumn)
Expand Down Expand Up @@ -83,6 +92,7 @@ private List<String> getSObjectTypes() throws ConnectionException {
sObjectTypesCache = Arrays.stream(sobs)
.map(DescribeGlobalSObjectResult::getName)
.collect(Collectors.toList());
logger.info("[PartnerService] getSObjectTypes count="+sObjectTypesCache.size());
}
return sObjectTypesCache;

Expand Down Expand Up @@ -127,6 +137,7 @@ private <T> List<List<T>> toBatches(List<T> objects, int batchSize) {
}

public List<List> query(String soql, List<FieldDef> expectedSchema) throws ConnectionException {
logger.info("[PartnerService] query "+soql);
List<List> resultRows = Collections.synchronizedList(new LinkedList<>());
QueryResult queryResult = null;
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ public V put(K key, V value) {
return value;
}

public ColumnMap<K, V> add(K key, V value) {
put(key, value);
return this;
}

public V get(K key) {
int index = columnNames.indexOf(key);
return index != -1 ? values.get(index) : null;
Expand All @@ -30,4 +35,16 @@ public V get(K key) {
public V getByIndex(int index) {
return values.get(index - 1);
}

public int size() {
return columnNames.size();
}

public ArrayList<K> getColumnNames() {
return columnNames;
}

public ArrayList<V> getValues() {
return values;
}
}
Loading