Skip to content

Commit 0ff91be

Browse files
lovasoacursoragent
andauthored
Allow large text fields in odbc (#1031)
* feat: Remove ODBC max column size limit and warn on password Co-authored-by: contact <[email protected]> * Refactor: Extract ODBC connection options to a separate function Co-authored-by: contact <[email protected]> * feat: Enhance ODBC connection options by adding batch size configuration and logging --------- Co-authored-by: Cursor Agent <[email protected]>
1 parent 941522b commit 0ff91be

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/webserver/database/connect.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use anyhow::Context;
1010
use futures_util::future::BoxFuture;
1111
use sqlx::{
1212
any::{Any, AnyConnectOptions, AnyKind},
13+
odbc::OdbcConnectOptions,
1314
pool::PoolOptions,
1415
sqlite::{Function, SqliteConnectOptions, SqliteFunctionCtx},
1516
ConnectOptions, Connection, Executor,
@@ -208,6 +209,9 @@ fn set_custom_connect_options(options: &mut AnyConnectOptions, config: &AppConfi
208209
if let Some(sqlite_options) = options.as_sqlite_mut() {
209210
set_custom_connect_options_sqlite(sqlite_options, config);
210211
}
212+
if let Some(odbc_options) = options.as_odbc_mut() {
213+
set_custom_connect_options_odbc(odbc_options, config);
214+
}
211215
}
212216

213217
fn set_custom_connect_options_sqlite(
@@ -235,13 +239,26 @@ fn make_sqlite_fun(name: &str, f: fn(&str) -> String) -> Function {
235239
})
236240
}
237241

242+
fn set_custom_connect_options_odbc(odbc_options: &mut OdbcConnectOptions, config: &AppConfig) {
243+
// Allow fetching very large text fields when using ODBC by removing the max column size limit
244+
let batch_size = config.max_pending_rows.clamp(1, 1024);
245+
odbc_options.batch_size(batch_size);
246+
log::trace!("ODBC batch size set to {batch_size}");
247+
// Disables ODBC batching, but avoids truncation of large text fields
248+
odbc_options.max_column_size(None);
249+
}
250+
238251
fn set_database_password(options: &mut AnyConnectOptions, password: &str) {
239252
if let Some(opts) = options.as_postgres_mut() {
240253
*opts = take(opts).password(password);
241254
} else if let Some(opts) = options.as_mysql_mut() {
242255
*opts = take(opts).password(password);
243256
} else if let Some(opts) = options.as_mssql_mut() {
244257
*opts = take(opts).password(password);
258+
} else if let Some(_opts) = options.as_odbc_mut() {
259+
log::warn!(
260+
"Setting a password for an ODBC connection is not supported via separate config; include credentials in the DSN or connection string"
261+
);
245262
} else if let Some(_opts) = options.as_sqlite_mut() {
246263
log::warn!("Setting a password for a SQLite database is not supported");
247264
} else {

0 commit comments

Comments
 (0)