Skip to content

Commit

Permalink
Adding OS, architecture and runtime details to applicationName
Browse files Browse the repository at this point in the history
  • Loading branch information
muskan124947 committed Mar 4, 2025
1 parent 7e795d4 commit f018b4b
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2623,7 +2623,7 @@ Connection connectInternal(Properties propsIn,
if (null != sPropValue)
validateMaxSQLLoginName(sPropKey, sPropValue);
else
activeConnectionProperties.setProperty(sPropKey, SQLServerDriver.DEFAULT_APP_NAME);
activeConnectionProperties.setProperty(sPropKey, SQLServerDriver.constructedAppName);

sPropKey = SQLServerDriverBooleanProperty.LAST_UPDATE_COUNT.toString();
sPropValue = activeConnectionProperties.getProperty(sPropKey);
Expand Down Expand Up @@ -6905,7 +6905,6 @@ final boolean complete(LogonCommand logonCommand, TDSReader tdsReader) throws SQ
String appName = activeConnectionProperties
.getProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString());
String interfaceLibName = "Microsoft JDBC Driver " + SQLJdbcVersion.MAJOR + "." + SQLJdbcVersion.MINOR;
//String interfaceLibName = SQLServerDriver.constructedAppName;
String databaseName = activeConnectionProperties
.getProperty(SQLServerDriverStringProperty.DATABASE_NAME.toString());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public void setApplicationName(String applicationName) {
@Override
public String getApplicationName() {
return getStringProperty(connectionProps, SQLServerDriverStringProperty.APPLICATION_NAME.toString(),
SQLServerDriverStringProperty.APPLICATION_NAME.getDefaultValue());
SQLServerDriver.constructedAppName);
}

/**
Expand Down
79 changes: 55 additions & 24 deletions src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -737,12 +737,12 @@ public final class SQLServerDriver implements java.sql.Driver {
+ " for SQL Server";
static final String AUTH_DLL_NAME = "mssql-jdbc_auth-" + SQLJdbcVersion.MAJOR + "." + SQLJdbcVersion.MINOR + "."
+ SQLJdbcVersion.PATCH + "." + Util.getJVMArchOnWindows() + SQLJdbcVersion.RELEASE_EXT;
static final String DEFAULT_APP_NAME = "Microsoft JDBC Driver for SQL Server";
// static final String APP_NAME_TEMPLATE = "Microsoft JDBC - %s, %s - %s";
// static final String constructedAppName;
// static {
// constructedAppName = getAppName();
// }
static final String DEFAULT_APP_NAME = "MS-JDBC|Unknown|Unknown|Unknown|Unknown";
static final String APP_NAME_TEMPLATE = "%s|%s|%s|%s|%s";
static final String constructedAppName;
static {
constructedAppName = getAppName();
}

/**
* Constructs the application name using system properties for OS, platform, and architecture.
Expand All @@ -751,18 +751,49 @@ public final class SQLServerDriver implements java.sql.Driver {
*
* @return the constructed application name or the default application name if properties are not available
*/
// static String getAppName() {
// String osName = System.getProperty("os.name", "");
// String osArch = System.getProperty("os.arch", "");
// String javaVmName = System.getProperty("java.vm.name", "");
// String javaVmVersion = System.getProperty("java.vm.version", "");
// String platform = javaVmName.isEmpty() || javaVmVersion.isEmpty() ? "" : javaVmName + " " + javaVmVersion;

// if (osName.isEmpty() && platform.isEmpty() && osArch.isEmpty()) {
// return DEFAULT_APP_NAME;
// }
// return String.format(APP_NAME_TEMPLATE, osName, platform, osArch);
// }
static String getAppName() {
return String.format(
APP_NAME_TEMPLATE,
"MS-JDBC",
getOSType(),
getArchitecture(),
getOSDetails(),
getRuntimeDetails()
);
}

static String getOSType() {
String osName = System.getProperty("os.name", "Unknown").trim();
if (osName.startsWith("Windows")) return "Windows";
if (osName.startsWith("Linux")) return "Linux";
if (osName.startsWith("Mac")) return "macOS";
if (osName.startsWith("FreeBSD")) return "FreeBSD";
if (osName.startsWith("Android")) return "Android";
return "Unknown";
}

static String getArchitecture() {
return sanitizeField(System.getProperty("os.arch", "Unknown").trim(), 10);
}

static String getOSDetails() {
String osName = System.getProperty("os.name", "").trim();
String osVersion = System.getProperty("os.version", "").trim();
if (osName.isEmpty() && osVersion.isEmpty()) return "Unknown";
return sanitizeField(osName + " " + osVersion, 44);
}

static String getRuntimeDetails() {
String javaVmName = System.getProperty("java.vm.name", "").trim();
String javaVmVersion = System.getProperty("java.vm.version", "").trim();
if (javaVmName.isEmpty() && javaVmVersion.isEmpty()) return "Unknown";
return sanitizeField(javaVmName + " " + javaVmVersion, 44);
}

static String sanitizeField(String field, int maxLength) {
String sanitized = field.replaceAll("[^A-Za-z0-9 .+_-]", "").trim();
return sanitized.isEmpty() ? "Unknown" : sanitized.substring(0, Math.min(sanitized.length(), maxLength));
}

private static final String[] TRUE_FALSE = {"true", "false"};

Expand Down Expand Up @@ -1073,9 +1104,9 @@ String getClassNameLogging() {
drLogger.finer("Error registering driver: " + e);
}
}
// if (loggerExternal.isLoggable(Level.FINE)) {
// loggerExternal.log(Level.FINE, "Application Name: " + SQLServerDriver.constructedAppName);
// }
if (loggerExternal.isLoggable(Level.FINE)) {
loggerExternal.log(Level.FINE, "Application Name: " + SQLServerDriver.constructedAppName);
}
}

// Check for jdk.net.ExtendedSocketOptions to set TCP keep-alive options for idle connection resiliency
Expand Down Expand Up @@ -1314,9 +1345,9 @@ public java.sql.Connection connect(String url, Properties suppliedProperties) th
Properties connectProperties = parseAndMergeProperties(url, suppliedProperties);
if (connectProperties != null) {
result = DriverJDBCVersion.getSQLServerConnection(toString());
// if (connectProperties.getProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString()) == null) {
// connectProperties.setProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString(), SQLServerDriver.constructedAppName);
// }
if (connectProperties.getProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString()) == null) {
connectProperties.setProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString(), SQLServerDriver.constructedAppName);
}
result.connect(connectProperties, null);
}
loggerExternal.exiting(getClassNameLogging(), "connect", result);
Expand Down
77 changes: 39 additions & 38 deletions src/test/java/com/microsoft/sqlserver/jdbc/SQLServerDriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ public void testApplicationName() throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT program_name FROM sys.dm_exec_sessions WHERE session_id = @@SPID")) {
if (rs.next()) {
assertEquals(SQLServerDriverStringProperty.APPLICATION_NAME.getDefaultValue(), rs.getString("program_name"));
assertEquals(SQLServerDriver.constructedAppName, rs.getString("program_name"));
}
} catch (SQLException e) {
fail(e.getMessage());
Expand All @@ -216,54 +216,55 @@ public void testApplicationName() throws SQLException {
*
* @throws SQLException
*/
// @Test
// public void testApplicationNameUsingApp_Name() throws SQLException {
// try (Connection conn = DriverManager.getConnection(connectionString);
// Statement stmt = conn.createStatement();
// ResultSet rs = stmt.executeQuery("SELECT app_name()")) {
// if (rs.next()) {
// assertEquals(SQLServerDriver.constructedAppName, rs.getString(1));
// }
// } catch (SQLException e) {
// fail(e.getMessage());
// }
// }
@Test
public void testApplicationNameUsingApp_Name() throws SQLException {
try (Connection conn = DriverManager.getConnection(connectionString);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT app_name()")) {
if (rs.next()) {
assertEquals(SQLServerDriver.constructedAppName, rs.getString(1));
}
} catch (SQLException e) {
fail(e.getMessage());
}
}

/**
* test application name by executing select app_name()
*
* @throws SQLException
*/
// @Test
// public void testAppNameWithSpecifiedApplicationName() throws SQLException {
// String url = connectionString + ";applicationName={0123456789012345678901234567890123456789012345678901234567890123456789012345678901234589012345678901234567890123456789012345678}";
@Test
public void testAppNameWithSpecifiedApplicationName() throws SQLException {
String url = connectionString + ";applicationName={0123456789012345678901234567890123456789012345678901234567890123456789012345678901234589012345678901234567890123456789012345678}";

// try (Connection conn = DriverManager.getConnection(url);
// Statement stmt = conn.createStatement();
// ResultSet rs = stmt.executeQuery("SELECT app_name()")) {
// if (rs.next()) {
// assertEquals("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234589012345678901234567890123456789012345678", rs.getString(1));
// }
// } catch (SQLException e) {
// fail(e.getMessage());
// }
// }
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT app_name()")) {
if (rs.next()) {
assertEquals("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234589012345678901234567890123456789012345678", rs.getString(1));
}
} catch (SQLException e) {
fail(e.getMessage());
}
}

/**
* test application name when system properties are empty
*
*/
// @Test
// public void testGetAppName() {
// String appName = SQLServerDriver.getAppName();
// assertNotNull(appName, "Application name should not be null");
// assertFalse(appName.isEmpty(), "Application name should not be empty");
@Test
public void testGetAppName() {
String appName = SQLServerDriver.getAppName();
assertNotNull(appName, "Application name should not be null");
assertFalse(appName.isEmpty(), "Application name should not be empty");

// System.setProperty("os.name", "");
// System.setProperty("os.arch", "");
// System.setProperty("java.vm.name", "");
// System.setProperty("java.vm.version", "");
// String defaultAppName = SQLServerDriver.getAppName();
// assertEquals(SQLServerDriver.DEFAULT_APP_NAME, defaultAppName, "Application name should be the default one");
// }
System.setProperty("os.name", "");
System.setProperty("os.arch", "");
System.setProperty("os.version", "");
System.setProperty("java.vm.name", "");
System.setProperty("java.vm.version", "");
String defaultAppName = SQLServerDriver.getAppName();
assertEquals(SQLServerDriver.DEFAULT_APP_NAME, defaultAppName, "Application name should be the default one");
}
}

0 comments on commit f018b4b

Please sign in to comment.