DBI/0000755000176200001440000000000015147513477010666 5ustar liggesusersDBI/tests/0000755000176200001440000000000015147357111012017 5ustar liggesusersDBI/tests/testthat/0000755000176200001440000000000015147513477013670 5ustar liggesusersDBI/tests/testthat/test-arrow.R0000644000176200001440000000266415071142015016110 0ustar liggesuserstest_that("write arrow to sqlite", { skip_if_not_installed("nanoarrow") skip_if_not_installed("RSQLite") con <- dbConnect(RSQLite::SQLite(), ":memory:") on.exit(dbDisconnect(con)) data <- data.frame( a = 1:3, b = 2.5, c = "three", stringsAsFactors = FALSE ) data$d <- blob::blob(as.raw(1:10)) tbl <- nanoarrow::as_nanoarrow_array_stream(data) dbCreateTableArrow(con, "data_tbl", tbl) dbAppendTableArrow(con, "data_tbl", tbl) tbl$release() expect_equal( dbReadTable(con, "data_tbl"), data ) tbl <- nanoarrow::as_nanoarrow_array_stream(data) res <- dbWriteTableArrow(con, "data_tbl", tbl, overwrite = TRUE) tbl$release() expect_equal( dbReadTable(con, "data_tbl"), data ) expect_equal( as.data.frame(dbReadTableArrow(con, "data_tbl")), data ) stream <- dbGetQueryArrow(con, "SELECT COUNT(*) FROM data_tbl") expect_equal( as.data.frame(stream)[[1]], nrow(data) ) stream$release() res <- dbSendQueryArrow(con, "SELECT COUNT(*) FROM data_tbl") expect_equal( as.data.frame(dbFetchArrow(res))[[1]], nrow(data) ) dbClearResult(res) # Implicit test for dbBind() tbl <- nanoarrow::as_nanoarrow_array_stream(data["a"]) stream <- dbGetQueryArrow( con, "SELECT * FROM data_tbl WHERE a < $a", params = tbl ) expect_equal( as.data.frame(stream), as.data.frame(data[c(1, 1:2), ], row.names = 1:3) ) tbl$release() }) DBI/tests/testthat/test-interpolate.R0000644000176200001440000000623015071142015017275 0ustar liggesuserstest_that("parameter names matched", { expect_equal( sqlInterpolate(ANSI(), "?a ?b", a = 1, b = 2), SQL("1 2") ) expect_equal( sqlInterpolate(ANSI(), "?a ?b", b = 2, a = 1), SQL("1 2") ) expect_equal( sqlInterpolate(ANSI(), "?a ?b", b = 2, .dots = list(a = 1)), SQL("1 2") ) expect_equal( sqlInterpolate(ANSI(), "?a ?b", .dots = list(a = 1, b = 2)), SQL("1 2") ) }) test_that("parameters in strings are ignored", { expect_equal( sqlInterpolate(ANSI(), "'? ?fuu'"), SQL("'? ?fuu'") ) }) test_that("named parameters check matches", { expect_error( sqlInterpolate(ANSI(), "?a ?b", a = 1, d = 2), "Supplied values don't match named vars to interpolate" ) }) test_that("positional parameters work", { expect_equal( sqlInterpolate(ANSI(), "a ? c ? d ", 1, 2), SQL("a 1 c 2 d ") ) }) test_that("positional parameters can't have names", { expect_error( sqlInterpolate(ANSI(), "? ?", a = 1, 2), "Positional variables don't take named arguments" ) }) test_that("parameters in comments are ignored", { expect_equal( sqlInterpolate(ANSI(), "-- ? ?fuu"), SQL("-- ? ?fuu") ) }) test_that("strings are quoted", { expect_equal( sqlInterpolate(ANSI(), "?a", a = "abc"), SQL("'abc'") ) }) test_that("unquoted strings", { expect_equal( sqlInterpolate(ANSI(), "?a ?b", a = SQL("abc"), b = SQL("('a','b')")), SQL("abc ('a','b')") ) }) test_that("some more complex case works as well", { expect_equal( sqlInterpolate( ANSI(), "asdf ?faa /*fdsa'zsc' */ qwer 'wer' \"bnmvbn\" -- Zc \n '234' ?fuu -- ? ?bar", faa = "abc", fuu = 42L ), SQL( "asdf 'abc' /*fdsa'zsc' */ qwer 'wer' \"bnmvbn\" -- Zc \n '234' 42 -- ? ?bar" ) ) }) test_that("escaping quotes with doubling works", { expect_equal( sqlInterpolate( ANSI(), "'this is a single '' one ?quoted string' ?bar ", bar = 42 ), SQL("'this is a single '' one ?quoted string' 42 ") ) }) test_that("corner cases work", { expect_equal( sqlInterpolate(ANSI(), ""), SQL("") ) expect_error( sqlInterpolate(ANSI(), "?"), "Supplied values don't match positional vars to interpolate" ) expect_equal( sqlInterpolate(ANSI(), "?a", a = 1), SQL("1") ) expect_equal( sqlInterpolate(ANSI(), "\"\""), SQL("\"\"") ) expect_error( sqlInterpolate(ANSI(), "\""), "Unterminated literal" ) expect_equal( sqlInterpolate(ANSI(), "?a\"\"?b", a = 1, b = 2), SQL("1\"\"2") ) expect_equal( sqlInterpolate(ANSI(), "--"), SQL("--") ) expect_equal( sqlInterpolate( ANSI(), "SELECT *\n--comment\n--consecutive comment with '\nFROM mytable" ), SQL("SELECT *\n--comment\n--consecutive comment with '\nFROM mytable") ) expect_error( sqlInterpolate(ANSI(), "/*"), "Unterminated comment" ) # Test escaping rules expect_identical( sqlParseVariablesImpl( "?a '?b\\'?c' ?d '''' ?e", list( sqlQuoteSpec("'", "'", escape = "\\", doubleEscape = FALSE) ), list() ), list( start = c(1L, 13L, 21L), end = c(2L, 14L, 22L) ) ) }) DBI/tests/testthat/test-quoting.R0000644000176200001440000000064714602466070016454 0ustar liggesuserstest_that("NA becomes NULL", { expect_equal(dbQuoteString(ANSI(), NA_character_), SQL("NULL")) }) test_that("strings surrounded by '", { expect_equal(dbQuoteString(ANSI(), "x"), SQL("'x'")) }) test_that("single quotes are doubled surrounded by '", { expect_equal(dbQuoteString(ANSI(), "It's"), SQL("'It''s'")) }) test_that("special chars are escaped", { expect_equal(dbQuoteString(ANSI(), "\n"), SQL("'\n'")) }) DBI/tests/testthat/test-table-insert.R0000644000176200001440000000161414602466070017352 0ustar liggesuserstest_that("appending with zero columns throws a dedicated error (#313)", { skip_if_not_installed("RSQLite") db <- dbConnect(RSQLite::SQLite(), ":memory:") on.exit(dbDisconnect(db)) dbExecute(db, "create table T(n integer primary key)") expect_error(dbAppendTable(db, "T", data.frame()), "column") }) test_that("appending with zero columns throws a dedicated error (#336)", { skip_if_not_installed("RSQLite") library(RSQLite) a <- data.frame(sep = c(1, 2, 3)) con <- dbConnect(SQLite()) on.exit(dbDisconnect(con)) dbWriteTable(con, "a", a) expect_equal(dbReadTable(con, "a"), a) }) test_that("appending with Id works (#380)", { skip_if_not_installed("RSQLite") db <- dbConnect(RSQLite::SQLite(), ":memory:") on.exit(dbDisconnect(db)) dbExecute(db, "create table T(n integer primary key)") expect_equal(dbAppendTable(db, Id(table = "T"), data.frame(n = 1:10)), 10) }) DBI/tests/testthat/test-quote.R0000644000176200001440000000273515071142015016112 0ustar liggesuserstest_that("identifier", { expect_equal(dbQuoteIdentifier(ANSI(), character()), SQL(character())) expect_equal(dbQuoteIdentifier(ANSI(), "a"), SQL('"a"')) expect_equal(dbQuoteIdentifier(ANSI(), "a b"), SQL('"a b"')) expect_equal(dbQuoteIdentifier(ANSI(), SQL('"a"')), SQL('"a"')) expect_equal(dbQuoteIdentifier(ANSI(), SQL('"a b"')), SQL('"a b"')) }) test_that("identifier names", { expect_equal( dbQuoteIdentifier(ANSI(), setNames(character(), character())), SQL(character(), names = character()) ) expect_equal(dbQuoteIdentifier(ANSI(), c(a = "a")), SQL('"a"', names = "a")) expect_equal( dbQuoteIdentifier(ANSI(), c(ab = "a b")), SQL('"a b"', names = "ab") ) expect_equal( dbQuoteIdentifier(ANSI(), SQL('"a"', names = "a")), SQL('"a"', names = "a") ) expect_equal( dbQuoteIdentifier(ANSI(), SQL('"a b"', names = "ab")), SQL('"a b"', names = "ab") ) }) test_that("SQL names", { expect_null(names(SQL(letters))) expect_equal(names(SQL(letters, names = LETTERS)), LETTERS) expect_null(names(SQL(setNames(letters, LETTERS)))) }) test_that("unquote Id", { expect_equal( dbUnquoteIdentifier(ANSI(), Id(table = "a")), list(Id(table = "a")) ) expect_equal( dbUnquoteIdentifier(ANSI(), Id(table = "a", schema = "b")), list(Id(table = "a", schema = "b")) ) expect_equal( dbUnquoteIdentifier(ANSI(), Id(table = "a", schema = "b", catalog = "c")), list(Id(table = "a", schema = "b", catalog = "c")) ) }) DBI/tests/testthat/test-otel.R0000644000176200001440000000372315143014221015713 0ustar liggesuserstest_that("OpenTelemetry tracing works", { skip_if_not_installed("RSQLite") skip_if_not_installed("otel") skip_if_not_installed("otelsdk") record <- with_otel_record({ con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbGetQuery(con, "SELECT * FROM `mtcars`") dbGetQuery( con, "SELECT COUNT(*) FROM \nmtcars WHERE cyl = ?", params = list(1:8) ) dbReadTable(con, "mtcars") dbRemoveTable(con, "mtcars") dbDisconnect(con) }) traces <- record$traces expect_length(traces, 10L) expect_equal(traces[[1L]]$name, "dbConnect RSQLite") expect_equal(traces[[1L]]$kind, "client") expect_equal(traces[[1L]]$attributes$db.system.name, "RSQLite") expect_equal(traces[[2L]]$name, "CREATE TABLE mtcars") expect_equal(traces[[2L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[2L]]$attributes$db.operation.name, "CREATE TABLE") expect_equal(traces[[3L]]$name, "INSERT INTO mtcars") expect_equal(traces[[3L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[3L]]$attributes$db.operation.name, "INSERT INTO") expect_equal(traces[[4L]]$name, "dbWriteTable mtcars") expect_equal(traces[[4L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[5L]]$name, "SELECT mtcars") expect_equal(traces[[5L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[5L]]$attributes$db.operation.name, "SELECT") expect_equal(traces[[6L]]$name, "SELECT mtcars") expect_equal(traces[[7L]]$name, "SELECT mtcars") expect_equal(traces[[8L]]$name, "dbReadTable mtcars") expect_equal(traces[[8L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[9L]]$name, "DROP TABLE mtcars") expect_equal(traces[[9L]]$attributes$db.collection.name, "mtcars") expect_equal(traces[[9L]]$attributes$db.operation.name, "DROP TABLE") expect_equal(traces[[10L]]$name, "dbDisconnect RSQLite") expect_equal(traces[[10L]]$attributes$db.system.name, "RSQLite") }) DBI/tests/testthat/test-methods.R0000644000176200001440000000107615071142015016415 0ustar liggesusersexpect_ellipsis <- function(name, method) { sym <- as.name(name) eval(bquote({ .(sym) <- method expect_true("..." %in% names(formals(.(sym)))) })) } test_that("all methods have ellipsis", { symbols <- ls(env = asNamespace("DBI")) objects <- mget( symbols, env = asNamespace("DBI"), mode = "function", ifnotfound = rep(list(NULL), length(symbols)) ) is_method <- vapply( objects, inherits, "standardGeneric", FUN.VALUE = logical(1L) ) methods <- objects[is_method] Map(expect_ellipsis, names(methods), methods) }) DBI/tests/testthat/test-DBItest.R0000644000176200001440000000203115144400576016252 0ustar liggesusers# Generated by helper-dev.R, do not edit by hand skip_if_not_installed("RSQLite") skip_if_not_installed("nanoarrow") # helper-DBItest.R # Also copied into DBI tryCatch(skip = function(e) message(conditionMessage(e)), { skip_on_cran() skip_if_not_installed("DBItest") DBItest::make_context( RSQLite::SQLite(), list(dbname = tempfile("DBItest", fileext = ".sqlite")), tweaks = DBItest::tweaks( dbitest_version = "1.8.1", constructor_relax_args = TRUE, placeholder_pattern = c("?", "$1", "$name", ":name"), date_cast = function(x) paste0("'", x, "'"), time_cast = function(x) paste0("'", x, "'"), timestamp_cast = function(x) paste0("'", x, "'"), logical_return = function(x) as.integer(x), date_typed = FALSE, time_typed = FALSE, timestamp_typed = FALSE ), name = "RSQLite" ) }) # test-DBItest.R # Also copied into DBI skip_on_cran() skip_if_not_installed("DBItest") DBItest::test_all( skip = c( if (getRversion() < "4.0") "stream_bind_too_many" ) ) DBI/tests/testthat/test-dbUnquoteIdentifier_DBIConnection.R0000644000176200001440000000207315071142015023417 0ustar liggesuserstest_that("can unquote any number of components", { expect_equal(dbUnquoteIdentifier(ANSI(), "a"), list(Id("a"))) expect_equal(dbUnquoteIdentifier(ANSI(), "a.b"), list(Id("a", "b"))) expect_equal(dbUnquoteIdentifier(ANSI(), "a.b.c"), list(Id("a", "b", "c"))) expect_equal( dbUnquoteIdentifier(ANSI(), "a.b.c.d"), list(Id("a", "b", "c", "d")) ) }) test_that("fail with NA input", { expect_error(dbUnquoteIdentifier(ANSI(), NA_character_)) expect_error(dbUnquoteIdentifier(ANSI(), c("a", NA_character_))) }) test_that("can unquote any quoted components", { expect_equal(dbUnquoteIdentifier(ANSI(), '"a.b"'), list(Id("a.b"))) expect_equal(dbUnquoteIdentifier(ANSI(), 'a."b"'), list(Id("a", "b"))) expect_equal(dbUnquoteIdentifier(ANSI(), '"a".b'), list(Id("a", "b"))) expect_equal(dbUnquoteIdentifier(ANSI(), '"a"."b"'), list(Id("a", "b"))) expect_equal(dbUnquoteIdentifier(ANSI(), '"a"""."b"""'), list(Id('a"', 'b"'))) }) test_that("Id is unchanged and wrapped in list", { expect_equal(dbUnquoteIdentifier(ANSI(), Id("foo")), list(Id("foo"))) }) DBI/tests/testthat/helper-dummy.R0000644000176200001440000000040014350241735016403 0ustar liggesusersMockObject <- setClass("MockObject", contains = "DBIObject") MockDriver <- setClass("MockDriver", contains = "DBIDriver") MockConnection <- setClass("MockConnection", contains = "DBIConnection") MockResult <- setClass("MockResult", contains = "DBIResult") DBI/tests/testthat/_snaps/0000755000176200001440000000000014602466070015142 5ustar liggesusersDBI/tests/testthat/_snaps/00-Id.md0000644000176200001440000000033415144400600016222 0ustar liggesusers# Id() requires a character vector Code Id(1) Condition Error: ! All elements of `...` must be strings. # has a decent print method Code Id("a", "b") Output "a"."b" DBI/tests/testthat/test-transactions_interrupt.R0000644000176200001440000000271215071142015021574 0ustar liggesuserstest_that("interrupting a transaction results in rollback, leaving DB in consistent state", { # hard to put in DBItest because need background R process to simulate interrupt skip_on_cran() skip_if_not_installed("RSQLite") skip_if_not_installed("callr") bg <- callr::r_bg( function() { con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:") on.exit(DBI::dbDisconnect(con, shutdown = TRUE), add = TRUE) DBI::dbWriteTable(con, 'TEST', data.frame(a = 0L), overwrite = TRUE) # First transaction: long sleep, gets interrupted tryCatch( DBI::dbWithTransaction(con, { DBI::dbWriteTable(con, 'TEST', data.frame(a = 1L), overwrite = TRUE) Sys.sleep(10) }), interrupt = function(e) { message("Transaction interrupted") } ) # Check transaction is aborted with [dbRollback()] if ( !isTRUE(all.equal(DBI::dbReadTable(con, 'TEST'), data.frame(a = 0L))) ) { stop("did not rollback") } # Test no errors starting a second transaction after previous interrupted transaction DBI::dbWithTransaction(con, { Sys.sleep(0.5) }) invisible(TRUE) }, supervise = TRUE ) # Give the background process a moment to start, then interrupt it. Sys.sleep(2) expect_true(bg$is_alive()) expect_true(bg$interrupt()) # Wait for completion and assert no error bg$wait() expect_equal(bg$get_result(), TRUE) }) DBI/tests/testthat/test-data-type.R0000644000176200001440000000102314602466070016643 0ustar liggesuserstest_that("dbDataType works on a data frame", { df <- data.frame(x = 1:10, y = runif(10)) types <- dbDataType(MockDriver(), df) expect_equal(types, c(x = "INT", y = "DOUBLE")) }) test_that("dbDataType works on AsIs", { drv <- MockDriver() int_value <- 1L expect_equal(dbDataType(drv, int_value), "INT") expect_equal(dbDataType(drv, I(int_value)), "INT") date_value <- structure(17455, class = "Date") expect_equal(dbDataType(drv, date_value), "DATE") expect_equal(dbDataType(drv, I(date_value)), "DATE") }) DBI/tests/testthat/test-00-Id.R0000644000176200001440000000161115071142015015516 0ustar liggesuserstest_that("Id() requires a character vector", { expect_snapshot(Id(1), error = TRUE) }) test_that("has a decent print method", { expect_snapshot(Id("a", "b")) }) test_that("each element is quoted individually", { expect_equal( DBI::dbQuoteIdentifier(ANSI(), Id("a", "b.c")), SQL('"a"."b.c"') ) }) test_that("Id organizes the standard named elements", { expect_equal( dbQuoteIdentifier( ANSI(), Id( "unnamed", column = "ultimate", table = "last", schema = "3rd", cluster = '1st', catalog = "2nd" ) ), SQL('"1st"."2nd"."3rd"."unnamed"."last"."ultimate"') ) }) test_that("Id organizes mingled named and unnamed elements; ignores NULL", { expect_equal( dbQuoteIdentifier( ANSI(), Id(table = "4", some_ref = "2", "3", catalog = "1", cluster = NULL) ), SQL('"1"."2"."3"."4"') ) }) DBI/tests/testthat/test-rownames.R0000644000176200001440000000213714602466070016615 0ustar liggesuserstest_that("logical row names uses default name", { df <- data.frame(x = c(a = 1)) expect_equal(sqlRownamesToColumn(df, NA)$row_name, "a") expect_equal(sqlRownamesToColumn(df, T)$row_name, "a") expect_equal(sqlRownamesToColumn(df, F)$row_name, NULL) }) test_that("character row names uses supplied name", { df <- data.frame(x = c(a = 1)) expect_equal(sqlRownamesToColumn(df, "x")$x, "a") }) test_that("no rownames in input gives no rownames in output", { df <- data.frame(x = 1) expect_equal(sqlRownamesToColumn(df, NA)$row_name, NULL) }) test_that("guess identify of row_names columns", { df <- data.frame(row_names = "a", x = 1, stringsAsFactors = FALSE) expect_equal(row.names(sqlColumnToRownames(df, NA)), "a") expect_equal(row.names(sqlColumnToRownames(df, TRUE)), "a") expect_equal(row.names(sqlColumnToRownames(df, FALSE)), "1") }) test_that("override identify of row_names column", { df <- data.frame(x = 1, y = "a", stringsAsFactors = FALSE) expect_equal(row.names(sqlColumnToRownames(df, "y")), "a") expect_error(row.names(sqlColumnToRownames(df, "z")), "not present") }) DBI/tests/testthat/test-sql-df.R0000644000176200001440000000037614627152541016155 0ustar liggesuserstest_that("NAs turn in NULLs", { df <- data.frame( x = c(1, NA), y = c("a", NA), stringsAsFactors = FALSE ) sql_df <- sqlData(ANSI(), df) expect_equal(sql_df$x, SQL(c("1", "NULL"))) expect_equal(sql_df$y, SQL(c("'a'", "NULL"))) }) DBI/tests/testthat/setup.R0000644000176200001440000000007614350241735015144 0ustar liggesuserssuppressWarnings(requireNamespace("RSQLite", quietly = TRUE)) DBI/tests/testthat.R0000644000176200001440000000060214602466070014000 0ustar liggesusers# This file is part of the standard setup for testthat. # It is recommended that you do not modify it. # # Where should you do additional test configuration? # Learn more about the roles of various files in: # * https://r-pkgs.org/testing-design.html#sec-tests-files-overview # * https://testthat.r-lib.org/articles/special-files.html library(testthat) library(DBI) test_check("DBI") DBI/.Rinstignore0000644000176200001440000000002514350241735013155 0ustar liggesusersinst/doc/figure1.pdf DBI/MD50000644000176200001440000004072215147513477011203 0ustar liggesusersb879293a2e3d0e4a52c6d68fc93a3b79 *DESCRIPTION 261c3e3ddc96347b5a8e3f19c299cc5d *NAMESPACE 8303d148c8cffcd462b9fde549ef9226 *NEWS.md 7b86b096bbce97a78a708fe0e933d89e *R/00-Id.R df6668faefa1a555a8f9e95afeb70904 *R/01-DBIObject.R 5198c6eec4b353ff88882ba47c3841f4 *R/02-DBIDriver.R 12d9b4d8127b015ad982b471b9e08b27 *R/03-DBIConnection.R b56706702384fe74719397d7d086f585 *R/04-DBIResult.R 3ac82a661c763fbfae79e7333bd33d18 *R/06-ANSI.R 705f1e15a0eb7a0f8dadb7d2ade172a3 *R/07-DBIResultArrow.R 01d52ee22a1d7c1d561021f3b570f2a8 *R/11-dbAppendTable.R d12faa4cf662d1ef282ebf6fb3a3cc30 *R/12-dbCreateTable.R f01b451cfd09ca1ff7822c4b998adf0c *R/13-dbWriteTable.R b82cfb3593c47a90115b60b000b5f2d8 *R/14-dbSendQuery.R df52a3e5d4f419fd35b188fde7b4d193 *R/15-dbBind.R c934aa82e7a6efb7f6b7d9164540268e *R/21-dbAppendTableArrow.R dff3d4fef9375b422b56d45bf88833a9 *R/22-dbCreateTableArrow.R 96421e4a2ff1c354aa0a55f816fe2a6b *R/23-dbWriteTableArrow.R 0d940d65f06770ba3365027bba71bdb3 *R/24-dbSendQueryArrow.R 6dcf8c3a055a79c60acbb99ff8b12e0b *R/25-dbBindArrow.R 78c75925bbe18c89d22aef1ea84f90e1 *R/DBI-package.R aaa699e36799c933fab8a992c867531f *R/DBIConnector.R b2f768366db7da783ad65fca06d8012f *R/SQL.R 53b3b335788e1f9d6f7b245ca6a708d5 *R/SQLKeywords.R 571f189c8b41db56bcadff84373280a4 *R/SQLKeywords_DBIObject.R 0d52e8ec54b12d9fd1627eca0d452b1d *R/SQLKeywords_missing.R 4d9aa53c1ba51a9cdc12438530a86b64 *R/data-types.R 19cd20ad37a89a7fd9046bd159252be1 *R/data.R e20b93cf4c0e5eb5beefd3c6aaba7047 *R/dbAppendTableArrow_DBIConnection.R 5062cc5c8d67ff1f0a1143eb5a023553 *R/dbAppendTable_DBIConnection.R cf86083d25415494a3a878fb3c550ca4 *R/dbBegin.R 4ec90f1ff24745365a46f8182e9f5577 *R/dbBindArrow_DBIResult.R 3160c46f7a6b0e7ff7cc378a544a4f0b *R/dbBindArrow_DBIResultArrowDefault.R 9641bb6f1784fab5dfe4950f42f97098 *R/dbBind_DBIResultArrow.R ebcb0a06817b6ee3bd762ffffe181b3d *R/dbCallProc.R 0ad2db9ea727c8d2b5e7c79d8dff910e *R/dbCanConnect.R 8e74ceea09e2d78e7578dec900608289 *R/dbCanConnect_DBIDriver.R df1cadbc745c382b5f640c6aee532732 *R/dbClearResult.R 4ddbc1942db95185fca2d4f554e4a23f *R/dbClearResult_DBIResultArrow.R 3465ffe2f2db302fede48bcb032a100a *R/dbColumnInfo.R 89dc4c2e5a612799f8a7065d63943989 *R/dbCommit.R b91a0c52a2981813170fd29ed47b2a87 *R/dbConnect.R 2650c8652de8a83756fedc456a03d476 *R/dbConnect_DBIConnector.R cb151ccc09f8722c67e973e186e8e49c *R/dbCreateTableArrow_DBIConnection.R 88e69f630fb25777d77e44cca8960db0 *R/dbCreateTable_DBIConnection.R e0dedd9f8a87289fc2432db9c62faa29 *R/dbDataType.R e86feef168b8c012513dd50b015fcd9e *R/dbDataType_DBIConnector.R 0c75124e20e8fb03d107b30a27c19760 *R/dbDataType_DBIObject.R 6a7c8d3ff261ea39d7b9f7fd93d01ace *R/dbDisconnect.R abb403153d4031b6dd90ec01fe2d3494 *R/dbDriver.R 77006a92266de53743b1b27dc2166e52 *R/dbDriver_character.R 04d02f17ee09f632a4692ae1df9cc1e9 *R/dbExecute.R 01434fa11b9710cc4e95da8b289aa78a *R/dbExecute_DBIConnection_character.R bd9987ce6df3389beb5ff8bf17392ff3 *R/dbExistsTable.R 5a578efa6e766c709c791ff203e93a2f *R/dbExistsTable_DBIConnection_Id.R 8899dc1942285435bf864b86763db556 *R/dbFetch.R c57833f001a1ab4bb76b973e638673f9 *R/dbFetchArrow.R 4862b43e440cc7590023e01b8908fa7e *R/dbFetchArrowChunk.R f5f9bc7aca6956bc0b3972dbffa9aa9e *R/dbFetchArrowChunk_DBIResultArrow.R 0cef2c1d7339b074fb6582e2f8cb6875 *R/dbFetchArrow_DBIResultArrow.R e98adbf9e505b36bceaaea8f3c935573 *R/dbFetch_DBIResult.R d7963c7d33ac02f5dd9b02c2e7d1bb78 *R/dbFetch_DBIResultArrow.R 06de594a8c476aca186766435a5d086a *R/dbGetConnectArgs.R 3263611b86c9d89eb9fee37f467972f0 *R/dbGetConnectArgs_DBIConnector.R bd224cf8c2106c7df139421780dd1b1d *R/dbGetException.R 16f01fa0362bcb2b4936e563c7efdce0 *R/dbGetInfo.R 2fd40282c5a9b312901ecc629586f37f *R/dbGetInfo_DBIResult.R bb4fcd50d16319130582914d62557e6f *R/dbGetInfo_DBIResultArrow.R 4dbf2cbd9bb96946913c1e0e89962dd6 *R/dbGetQuery.R 1857d336ce79c6d21575a9e40d37803a *R/dbGetQueryArrow.R 7d93e6e9d6c7d92f5ba513d5d493f519 *R/dbGetQueryArrow_DBIConnection.R 19060c1bffde0b1e9774766cd8c93722 *R/dbGetQuery_DBIConnection_character.R 40e989df3d934468c31ba07c6faa3d1e *R/dbGetRowCount.R 3ab1358c6fd8921f3bc540d2649cac81 *R/dbGetRowCount_DBIResultArrow.R 3faa7358272afd3bb88880b5df31b8fa *R/dbGetRowsAffected.R c6f57edc7d11b705ccbf7c9cd5492629 *R/dbGetRowsAffected_DBIResultArrow.R d4b668cb76ad839f15510701539d974c *R/dbGetStatement.R 5a5aa73155db8f2c9bbe658214f3bedd *R/dbGetStatement_DBIResultArrow.R d7099a124b5ae1b500c2de129f706470 *R/dbHasCompleted.R 843f3693a5aa4858ca71441a3afa934c *R/dbHasCompleted_DBIResultArrow.R b2a949f66bae0bce9ccc9560c7727549 *R/dbIsReadOnly.R 20c1c442df9885b1dde2a79b4d5fdc52 *R/dbIsReadOnly_DBIConnector.R 083f467fd264c59ccafacef611d3429d *R/dbIsReadOnly_DBIObject.R e00076986a0a6b77d779277fbc0bb3ac *R/dbIsValid.R a0d3864e5374a4605db14c1e8b605f4f *R/dbIsValid_DBIResultArrowDefault.R 3c05561b26262d1794cf485e189d5009 *R/dbListConnections.R 6a28149cfc094260c66b2125c29216b8 *R/dbListFields.R 3075aec72adb0fe54fbb424c6a226ae8 *R/dbListFields_DBIConnection_Id.R a0edab14b79f7aa3b3c1a60d2a2cae1d *R/dbListFields_DBIConnection_character.R 76aa1ea73038fcef098a171538f08685 *R/dbListObjects.R f64006d2ea1aeb36ca21f70ece584243 *R/dbListObjects_DBIConnection_ANY.R fc8b76338e9f4c58ebfe90d0e4299dcf *R/dbListResults.R bef7540d1c27084ddfe5d1ada912fad2 *R/dbListTables.R 0220c44ca7a18ad4270ff5a7be5133d6 *R/dbQuoteIdentifier.R e75dc77fa63d2f5e7cd4863a7dc614c4 *R/dbQuoteIdentifier_DBIConnection.R a2d3b19846d4dfa0f9b24a3e92c19086 *R/dbQuoteLiteral.R 19887ef97ac639351c8ab00db8bdf31b *R/dbQuoteLiteral_DBIConnection.R a2eda269f83334b66dde7c9b307d4910 *R/dbQuoteString.R 1230e1970996acdf26d623e30eb3cd9b *R/dbQuoteString_DBIConnection.R ad2628b1148b954c30854fc61e2b8469 *R/dbReadTable.R d65b1a5732f7586348f4764e19075ede *R/dbReadTableArrow.R eace7a85d3cefc422ba77ef631a09011 *R/dbReadTableArrow_DBIConnection.R 97539df93f41e6175647a0e6debdc59f *R/dbReadTable_DBIConnection_Id.R b7515e5261f064f3f384c67d5200c4c9 *R/dbReadTable_DBIConnection_character.R d3415b36559536c0e5917c665af26882 *R/dbRemoveTable.R 824e55fb7887a8b6303b249bfa7efff6 *R/dbRemoveTable_DBIConnection_Id.R 83e080992ae4514aa3ad64e695e97ab0 *R/dbRollback.R 31638c52633c3bd9909324f6b5839679 *R/dbSendQueryArrow_DBIConnection.R 81655ef94683bfd48eb0148f8de53c57 *R/dbSendStatement.R f1e5d9d2f913249efb0d4a8895c3efcc *R/dbSendStatement_DBIConnection_character.R 355841fe0254b62110663ef6c829a1ef *R/dbSetDataMappings.R 7c54993d78562855f2495e00eef9a931 *R/dbUnloadDriver.R fcc7b02a191e75c5040d337291a3dc64 *R/dbUnquoteIdentifier.R d6e53e769a3f63f26982be03a0e27588 *R/dbUnquoteIdentifier_DBIConnection.R f21991213c3a4d507c761ceec8f0f1ea *R/dbWithTransaction.R 1b5a186e494c1d565e8254c954841e0c *R/dbWithTransaction_DBIConnection.R e64a116fa66f4b86e1c1f101c659b5c7 *R/dbWriteTableArrow_DBIConnection.R 91fb5ba86c064033893a4f2531fdaf86 *R/dbWriteTable_DBIConnection_Id_ANY.R c9390c8132ece818d66461227aa8d8a0 *R/dbiDataType.R b844e95f8a72cf21aba5b964041dcc32 *R/dbiDataType_ANY.R 65e5f21c95d37a35f6c8e9bf26af4924 *R/dbiDataType_AsIs.R e14fcdbe5bd13075c2193fa6ffaf5725 *R/dbiDataType_Date.R ac198cf63328dbe7fd1711cb184b8676 *R/dbiDataType_POSIXct.R 1ba179139ce12b0eca1e3e878f826778 *R/dbiDataType_character.R c83e452b5b55e1fa6a4db75c846ed422 *R/dbiDataType_data.frame.R 9d22ef1d422877d009aebf4ae1ab3301 *R/dbiDataType_default.R 450179c1d1f5a291ff0356d162a16dd3 *R/dbiDataType_difftime.R 6b84efab5913fff83c08e4395add3887 *R/dbiDataType_integer.R 5b77a56457bb158205ed0ba49cf09422 *R/dbiDataType_list.R 2ef2c7e953c5fe370c087dc1a47cb8cd *R/dbiDataType_logical.R 5212cee8aa1f93cb8858891aa051cd6f *R/dbiDataType_numeric.R fbd9e63f2e958996a47abb94143c673d *R/deprecated.R 2c817cb0bc6364b1c98ee71eaa0eae84 *R/fetch.R 2463950fd640ca47273a5315d957068d *R/hms.R 112f5b2745490908ff9d2fcabcf4395e *R/interpolate.R bd38754fd923627f39ecab1e15edcdd3 *R/isSQLKeyword.R 6e3f61ef10cbe316fc68551aa2bd8ef3 *R/isSQLKeyword_DBIObject_character.R 1f789e90375796a16ca3843dce72fcc1 *R/make.db.names.R 03642895829e912f2e9b95b1ecb866f6 *R/make.db.names_DBIObject_character.R 2ef7b7fff51bd71e08b3e27a20f6e435 *R/methods_as_rd.R 2830246bfd6e609f683f2e3d83379a43 *R/otel.R 947f83142489ed41e8b97aba4f6e2ef4 *R/rownames.R d0f80664d65f61b3333651242759530d *R/show_AnsiConnection.R 3517272e0ee5248cb2cda618e5725e06 *R/show_DBIConnection.R 44656888881609c3aaaba36d118bd00b *R/show_DBIConnector.R c56d4e1596bc44c0b69148d3a8e75668 *R/show_DBIDriver.R ea4f9428ed80facc11f600319d096efb *R/show_DBIResult.R c55be6c2418396a61394653ab4d667aa *R/show_Id.R 5b47c215dc77c4743a76852e264e67ce *R/show_SQL.R 35e1bb9553fd43b8b217a3b926d965c1 *R/sqlAppendTable.R 4308a11c8e72424905da6f9b46ef1f07 *R/sqlAppendTableTemplate.R 8a9871a268d6071ca55b557e9b191921 *R/sqlAppendTable_DBIConnection.R 4c4e9883f2837ba77b7b8618bc69fb20 *R/sqlCreateTable.R d15a131d185eb3d94ac63e34b7af6362 *R/sqlCreateTable_DBIConnection.R 2a2508e90deab5e2da1284cef1a57564 *R/sqlData.R 24f1bf8225b3cd27b652ecd726b0b7bf *R/sqlData_DBIConnection.R fefc9de94ce2ca4184a62cec19f432de *R/sqlInterpolate.R 5276afd3e4b3f99e4daff005ebba8877 *R/sqlInterpolate_DBIConnection.R e13594b8c77bc5846ef7a31ce23b094a *R/sqlParseVariables.R 32ffd70f624077dfd0094759550ebb51 *R/sqlParseVariables_DBIConnection.R 42f3ac8f9e3bf2c02205e18b7be385f3 *R/summary.R 0102589dc220e4a35f82466bc4fda1a4 *R/summary_DBIObject.R c2e81afb106abc23851775e46d795000 *R/transactions.R 1b7c83688dd5adabc765f44ab64e4b43 *README.md 1b2ab4c4bfdc3cb7c4190ca4f5119d00 *build/stage23.rdb 3ba0f34ae27c61be8e197b511819a738 *build/vignette.rds 9bfdd96f1790a32f2e6db3a3758ad785 *inst/doc/DBI-1.Rmd 9348a1289c4e9aae800bfa2d3097ab92 *inst/doc/DBI-1.html 4899c9a334116dc03394d258c964b4fd *inst/doc/DBI-advanced.R 10fd312adf3beb1f748604cefd38482b *inst/doc/DBI-advanced.Rmd 8a13397df3575f2f71e7bf9d435381bc *inst/doc/DBI-advanced.html 95fb12f4306c5310eb1f2031de5e8a4a *inst/doc/DBI-arrow.R 75540b51f9123b5f2d12716079a4900e *inst/doc/DBI-arrow.Rmd 6e0a17bbe1cd8ff7c6f7f599aeb15b82 *inst/doc/DBI-arrow.html 0cb90dc5f9e5b0a9b289f70dfe997079 *inst/doc/DBI-history.Rmd a08e730c0c2f3c4f7bb370540800f70f *inst/doc/DBI-history.html 363ab6fc48b043f76130050b4e90917a *inst/doc/DBI-proposal.Rmd 7aadd1993579016c23c41a65404b9e9b *inst/doc/DBI-proposal.html 90bde1beb6f89d0e9d5e4e21412753c3 *inst/doc/DBI.R 0047e328fa54d17e5df4b12b538ee4c3 *inst/doc/DBI.Rmd 7412cde17ac5b72ee2c6b9ea5526cfd6 *inst/doc/DBI.html 307b62fe7899567cd7a02c28f65ff726 *inst/doc/backend.R da87ef36460fcc8fc9d643bf8ade0ae3 *inst/doc/backend.Rmd 80eaea53b3a7313f8b80f6a2c6b19c54 *inst/doc/backend.html 79a10903a9332c71d8092d7859073f1f *inst/doc/spec.R 55510128b0e7e531f19c4229874cfd0e *inst/doc/spec.Rmd 023c0025ddf69d14388f0260c9e07adb *inst/doc/spec.html 3414b76d8057e97cfd58968b7a7ac837 *man/ANSI.Rd ca9721eaa444fd59023694caedf9bb9c *man/DBI-package.Rd ab064c3c46ffbbd8710b074f74268ee4 *man/DBIConnection-class.Rd 7e8db86abb813052c8a97fcdcbab891d *man/DBIConnector-class.Rd d6bab15f03567bc5047491d1b1de9ac2 *man/DBIDriver-class.Rd 8998a96e16bae8e43ec12f77c6ad71e7 *man/DBIObject-class.Rd 73f7e24e72271377afe15a0d32772fe5 *man/DBIResult-class.Rd 410ef6f7cebf63c23f1c529abfed78b2 *man/DBIResultArrow-class.Rd 3a90727203cd716586e82c69e8af3717 *man/Id.Rd 0abe5e81e5b910eb92f501e0d12102f5 *man/SQL.Rd 5372df9a8835d41dff856e1808202675 *man/dbAppendTable.Rd cd4d003fc55bc807f7f570669acb7812 *man/dbAppendTableArrow.Rd 4f57544e7e9fa18c351ac1dcaccb1083 *man/dbBind.Rd f88ce0ae82ce59297b13cd1a581c4105 *man/dbCallProc.Rd 9f220bc97495464c6d6c1405e9f07f4a *man/dbCanConnect.Rd 95c7101d6530b09579b2d0a0e5240be3 *man/dbClearResult.Rd cdec73d94cf23e09866332e9d9002314 *man/dbColumnInfo.Rd 61d1bf063cb2b4ba7b12a54051018f4c *man/dbConnect.Rd 746e27477737f0b4de0abd883a9c23d0 *man/dbCreateTable.Rd 20be63b3185fb4f8197318bccf60d972 *man/dbCreateTableArrow.Rd 2fd823be48d6eb28f3d659715538969c *man/dbDataType.Rd ab2b8bfe2a2c72da7279c8f07b55b4b0 *man/dbDisconnect.Rd 7e0a883d4537ad49edfc591b191b6585 *man/dbDriver.Rd a7e0ee2ff474987dca8181c99c04e44b *man/dbExecute.Rd 07e49a8e0e1702260becc1b3767dea76 *man/dbExistsTable.Rd 70905c7b8da990166708e5c8c57fe396 *man/dbFetch.Rd 544c779da5df7fe80e6cf0bcbeea02b0 *man/dbFetchArrow.Rd 6e5f3d65fca854b87bcb000cdca210d6 *man/dbFetchArrowChunk.Rd 306cf337e7ab579ed6a5ca717a752528 *man/dbGetConnectArgs.Rd 600709b1318e882e99b98e90fa8ba7e7 *man/dbGetDBIVersion.Rd 55b15e7885494ce72f5d9a76fdb710e6 *man/dbGetException.Rd 90f48fa63bdf17617fa622b39bbd4d33 *man/dbGetInfo.Rd 58597abe1f7a298bc9834da0d19e5919 *man/dbGetQuery.Rd 50f49b3a07896d421bfbf5ba3d09ab99 *man/dbGetQueryArrow.Rd 7db615e142840625192a51f7ea73b164 *man/dbGetRowCount.Rd 86d6d8d8ca955c724f347e535649b420 *man/dbGetRowsAffected.Rd deacad47d397e267882a7b04879be9f7 *man/dbGetStatement.Rd 4a86b3d9f5ca884073f5311dc0dfa372 *man/dbHasCompleted.Rd 12718205b9dd838dfcea973df6a99197 *man/dbIsReadOnly.Rd 54371b40af82a24b2d4b389b2c2f1b33 *man/dbIsValid.Rd 45195aabed941c5835837ef3944a48f6 *man/dbListConnections.Rd 7d4e0f8d4e889155c1d4074cc2b865cc *man/dbListFields.Rd 2c23d527cc980d986f7f0eceae8d746e *man/dbListObjects.Rd 06802bbda414892adddac28d81766c18 *man/dbListResults.Rd 795e5843b866a9b1fe9e2a11e8ef36a1 *man/dbListTables.Rd 1e0e3f509c1c9657f55fa7d7fa84076a *man/dbQuoteIdentifier.Rd 659f917f11fdd0ff89b943ffac33bb18 *man/dbQuoteLiteral.Rd 8b2544682727d9cd48a0cd468020f0e2 *man/dbQuoteString.Rd 04278d6c0473a8f3cd07ad95b8ea8c6a *man/dbReadTable.Rd d62a6d651ce7bba3c4d83fa342f6f4f0 *man/dbReadTableArrow.Rd 79de7bbee135e5998069aee676dcbfcd *man/dbRemoveTable.Rd a5d253d5a419fe20473fc2cd1648a62b *man/dbSendQuery.Rd 655e7bd9cb7cb765df41f9d4e453652e *man/dbSendQueryArrow.Rd 5919e141c041852c9c55d4cec5c262b9 *man/dbSendStatement.Rd aa5d0bf6981e5690cdfdde12a53ec958 *man/dbSetDataMappings.Rd f299d0f4bc23341f85974e9f41211313 *man/dbUnquoteIdentifier.Rd 26175817ee0a45a710e5c8e16668b9a2 *man/dbWithTransaction.Rd d0f444fab1671536c0078abfa0670f2b *man/dbWriteTable.Rd 4219c4f56462565e3007f1492d8f3819 *man/dbWriteTableArrow.Rd eeb064c9b0e28e5263755b8b2b8fbf13 *man/dot-SQL92Keywords.Rd a1cbaf3f328e8d74e747faacf640c7fc *man/figures/lifecycle-archived.svg 6f521fb1819410630e279d1abf88685a *man/figures/lifecycle-defunct.svg 391f696f961e28914508628a7af31b74 *man/figures/lifecycle-deprecated.svg 691b1eb2aec9e1bec96b79d11ba5e631 *man/figures/lifecycle-experimental.svg 405e252e54a79b33522e9699e4e9051c *man/figures/lifecycle-maturing.svg f41ed996be135fb35afe00641621da61 *man/figures/lifecycle-questioning.svg 306bef67d1c636f209024cf2403846fd *man/figures/lifecycle-soft-deprecated.svg ed42e3fbd7cc30bc6ca8fa9b658e24a8 *man/figures/lifecycle-stable.svg bf2f1ad432ecccee3400afe533404113 *man/figures/lifecycle-superseded.svg 3bbccfce9273099763a85541a3f653d5 *man/hidden_aliases.Rd ffba08bcb57becb6455b5165b6ef441d *man/make.db.names.Rd 4a7f8a265551b2f3dea24c3692721638 *man/rownames.Rd 5a453dec45fc5446ff0f2fe79c2c8e47 *man/sqlAppendTable.Rd 68107961a34d4649f3a65a98ffaed1da *man/sqlCreateTable.Rd 34eb62f416dcc41c0439e90e16c94cda *man/sqlData.Rd fcabc7b349489575b6c3dce063acf9a4 *man/sqlInterpolate.Rd f0d18acb231943d6f25691e6d1558492 *man/sqlParseVariables.Rd d5a103dc4bac8531aa6bb8438844e49c *man/transactions.Rd bf33e807cc16ea1b4376f48ebde12861 *tests/testthat.R 72e4e900b434270afacf30c871276669 *tests/testthat/_snaps/00-Id.md a607e1deab234336d12e88ad2b80fd80 *tests/testthat/helper-dummy.R 6d7152ea22dc498b844cb6d912b1c771 *tests/testthat/setup.R e7bbb07a40b744f3af703990deddb139 *tests/testthat/test-00-Id.R 7075698b944ff4fdaca9e5c006b83162 *tests/testthat/test-DBItest.R 3a63e97f63a8416d3e0b5e5a52a49009 *tests/testthat/test-arrow.R c85afd831e2fdf9e4cbb9a8ebb73671e *tests/testthat/test-data-type.R 60501aeaf684cac8a0798196e7beca5f *tests/testthat/test-dbUnquoteIdentifier_DBIConnection.R 653e0129ffc03de2ef408dae4555d417 *tests/testthat/test-interpolate.R 48946dc2c187cf11bb6eacc1da51656a *tests/testthat/test-methods.R 864ddc2b62c64c28156dc6f990fe8d7b *tests/testthat/test-otel.R feb04052b5a03e8d41a703f8ac52eff4 *tests/testthat/test-quote.R 0c6dc973642147f079d15e0477aa63d4 *tests/testthat/test-quoting.R 7895ec58f5c8d1e39634cbe839439283 *tests/testthat/test-rownames.R d6fd2ea45be6ac9ebf2643f2ea29dcdf *tests/testthat/test-sql-df.R bda1a87eaadd2fa466b451a36be1bf7a *tests/testthat/test-table-insert.R 86d9f186d7597edafd7c8f8ab02f6b7c *tests/testthat/test-transactions_interrupt.R 9bfdd96f1790a32f2e6db3a3758ad785 *vignettes/DBI-1.Rmd 10fd312adf3beb1f748604cefd38482b *vignettes/DBI-advanced.Rmd 75540b51f9123b5f2d12716079a4900e *vignettes/DBI-arrow.Rmd 0cb90dc5f9e5b0a9b289f70dfe997079 *vignettes/DBI-history.Rmd 363ab6fc48b043f76130050b4e90917a *vignettes/DBI-proposal.Rmd 0047e328fa54d17e5df4b12b538ee4c3 *vignettes/DBI.Rmd da87ef36460fcc8fc9d643bf8ade0ae3 *vignettes/backend.Rmd 67cca7009a40f5c6bab58418607deb57 *vignettes/biblio.bib 16facd043de5250ab88f5b3badef9ab0 *vignettes/hierarchy.png 55510128b0e7e531f19c4229874cfd0e *vignettes/spec.Rmd 0db42429d7746738cbd4621b2fbd56e0 *vignettes/spec.md DBI/R/0000755000176200001440000000000015147357111011056 5ustar liggesusersDBI/R/dbDisconnect.R0000644000176200001440000000125315143005033013566 0ustar liggesusers#' Disconnect (close) a connection #' #' This closes the connection, discards all pending work, and frees #' resources (e.g., memory, sockets). #' #' @template methods #' @templateVar method_name dbDisconnect #' #' @inherit DBItest::spec_connection_disconnect return #' @inheritSection DBItest::spec_connection_disconnect Failure modes #' #' @inheritParams dbGetQuery #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' dbDisconnect(con) setGeneric("dbDisconnect", def = function(conn, ...) { otel_local_active_span("dbDisconnect", conn) standardGeneric("dbDisconnect") }) DBI/R/dbCallProc.R0000644000176200001440000000074715071142015013205 0ustar liggesusers#' Call an SQL stored procedure #' #' **Deprecated since 2014** #' #' The recommended way of calling a stored procedure is now #' #' \enumerate{ #' \item{\code{\link{dbGetQuery}} if a result set is returned} #' \item{\code{\link{dbExecute}} for data manipulation and other cases where no result set is returned} #' } #' #' @inheritParams dbGetQuery #' @keywords internal #' @export setGeneric("dbCallProc", def = function(conn, ...) { .Deprecated() standardGeneric("dbCallProc") }) DBI/R/dbQuoteIdentifier_DBIConnection.R0000644000176200001440000000261415071142015017277 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbQuoteIdentifier_DBIConnection <- function(conn, x, ...) { # Don't support lists, auto-vectorization violates type stability if (is(x, "SQL")) { return(x) } if (!is.character(x)) { stop("x must be character or SQL", call. = FALSE) } if (any(is.na(x))) { stop("Cannot pass NA to dbQuoteIdentifier()", call. = FALSE) } # Avoid fixed = TRUE due to https://github.com/r-dbi/DBItest/issues/156 x <- gsub('"', '""', enc2utf8(x)) if (length(x) == 0L) { SQL(character(), names = names(x)) } else { # Not calling encodeString() here to keep things simple SQL(paste('"', x, '"', sep = ""), names = names(x)) } } #' @rdname hidden_aliases #' @export setMethod( "dbQuoteIdentifier", signature("DBIConnection"), dbQuoteIdentifier_DBIConnection ) # Need to keep other method declarations around for now, because clients might # use getMethod(), see e.g. https://github.com/r-dbi/odbc/pull/149 #' @rdname hidden_aliases #' @export setMethod( "dbQuoteIdentifier", signature("DBIConnection", "character"), dbQuoteIdentifier_DBIConnection ) #' @rdname hidden_aliases #' @export setMethod( "dbQuoteIdentifier", signature("DBIConnection", "SQL"), dbQuoteIdentifier_DBIConnection ) #' @rdname hidden_aliases #' @export setMethod( "dbQuoteIdentifier", signature("DBIConnection", "Id"), dbQuoteIdentifier_DBIConnection_Id ) DBI/R/dbListFields_DBIConnection_Id.R0000644000176200001440000000041215071142015016647 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbListFields_DBIConnection_Id <- function(conn, name, ...) { list_fields(conn, name) } #' @rdname hidden_aliases #' @export setMethod( "dbListFields", signature("DBIConnection", "Id"), dbListFields_DBIConnection_Id ) DBI/R/make.db.names_DBIObject_character.R0000644000176200001440000000062315071142015017415 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL make.db.names_DBIObject_character <- function( dbObj, snames, keywords, unique, allow.keywords, ... ) { make.db.names.default(snames, keywords, unique, allow.keywords) } #' @rdname hidden_aliases setMethod( "make.db.names", signature(dbObj = "DBIObject", snames = "character"), make.db.names_DBIObject_character, valueClass = "character" ) DBI/R/dbClearResult_DBIResultArrow.R0000644000176200001440000000040415071142015016611 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbClearResult_DBIResultArrow <- function(res, ...) { dbClearResult(res@result, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbClearResult", signature("DBIResultArrow"), dbClearResult_DBIResultArrow ) DBI/R/dbGetConnectArgs_DBIConnector.R0000644000176200001440000000062415071142015016677 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetConnectArgs_DBIConnector <- function(drv, eval = TRUE, ...) { conn_args <- drv@.conn_args if (isTRUE(eval)) { conn_args <- lapply(conn_args, function(x) { if (is.function(x)) x() else x }) } conn_args } #' @rdname hidden_aliases #' @export setMethod( "dbGetConnectArgs", signature("DBIConnector"), dbGetConnectArgs_DBIConnector ) DBI/R/dbRollback.R0000644000176200001440000000017315071142015013230 0ustar liggesusers#' @export #' @rdname transactions setGeneric("dbRollback", def = function(conn, ...) { standardGeneric("dbRollback") }) DBI/R/13-dbWriteTable.R0000644000176200001440000000414715144400570013773 0ustar liggesusers#' Copy data frames to database tables #' #' Writes, overwrites or appends a data frame to a database table, optionally #' converting row names to a column and specifying SQL data types for fields. #' #' @details #' This function expects a data frame. #' Use [dbWriteTableArrow()] to write an Arrow object. #' #' This function is useful if you want to create and load a table at the same time. #' Use [dbAppendTable()] or [dbAppendTableArrow()] for appending data to an existing #' table, [dbCreateTable()] or [dbCreateTableArrow()] for creating a table, #' and [dbExistsTable()] and [dbRemoveTable()] for overwriting tables. #' #' DBI only standardizes writing data frames with `dbWriteTable()`. #' Some backends might implement methods that can consume CSV files #' or other data formats. #' For details, see the documentation for the individual methods. #' #' @template methods #' @templateVar method_name dbWriteTable #' #' @inherit DBItest::spec_sql_write_table return #' @inheritSection DBItest::spec_sql_write_table Failure modes #' @inheritSection DBItest::spec_sql_write_table Additional arguments #' @inheritSection DBItest::spec_sql_write_table Specification #' #' @inheritParams dbGetQuery #' @inheritParams dbReadTable #' @param value A [data.frame] (or coercible to data.frame). #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars[1:5, ]) #' dbReadTable(con, "mtcars") #' #' dbWriteTable(con, "mtcars", mtcars[6:10, ], append = TRUE) #' dbReadTable(con, "mtcars") #' #' dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE) #' dbReadTable(con, "mtcars") #' #' # No row names #' dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE, row.names = FALSE) #' dbReadTable(con, "mtcars") setGeneric("dbWriteTable", def = function(conn, name, value, ...) { otel_local_active_span( "dbWriteTable", conn, label = .dbi_get_collection_name(name, conn), attributes = list(db.collection.name = .dbi_get_collection_name(name, conn)) ) standardGeneric("dbWriteTable") }) DBI/R/show_AnsiConnection.R0000644000176200001440000000032014350241735015145 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL show_AnsiConnection <- function(object) { cat("\n") } #' @rdname hidden_aliases #' @export setMethod("show", "AnsiConnection", show_AnsiConnection) DBI/R/dbQuoteString_DBIConnection.R0000644000176200001440000000223115071142015016456 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbQuoteString_DBIConnection <- function(conn, x, ...) { if (is(x, "SQL")) { return(x) } if (!is.character(x)) { stop("x must be character or SQL", call. = FALSE) } # Avoid fixed = TRUE due to https://github.com/r-dbi/DBItest/issues/156 x <- gsub("'", "''", enc2utf8(x)) if (length(x) == 0L) { SQL(character()) } else { # Not calling encodeString() here, see also https://stackoverflow.com/a/549244/946850 # and especially the comment by �lvaro González str <- paste("'", x, "'", sep = "") str[is.na(x)] <- "NULL" SQL(str) } } # Need to keep other method declarations around for now, because clients might # use getMethod(), see e.g. https://github.com/r-dbi/odbc/pull/149 #' @rdname hidden_aliases #' @export setMethod( "dbQuoteString", signature("DBIConnection"), dbQuoteString_DBIConnection ) #' @rdname hidden_aliases #' @export setMethod( "dbQuoteString", signature("DBIConnection", "character"), dbQuoteString_DBIConnection ) #' @rdname hidden_aliases #' @export setMethod( "dbQuoteString", signature("DBIConnection", "SQL"), dbQuoteString_DBIConnection ) DBI/R/06-ANSI.R0000644000176200001440000000067214602466070012163 0ustar liggesuserssetClass("AnsiConnection", contains = "DBIConnection") #' A dummy DBI connector that simulates ANSI-SQL compliance #' #' @export #' @keywords internal #' @examples #' ANSI() ANSI <- function() { new("AnsiConnection") } #' Internal page for hidden aliases #' #' For S4 methods that require a documentation entry but only clutter the index. #' #' @usage NULL #' @format NULL #' @keywords internal #' @docType methods hidden_aliases <- NULL DBI/R/dbConnect.R0000644000176200001440000000361615143005033013073 0ustar liggesusers#' Create a connection to a DBMS #' #' Connect to a DBMS going through the appropriate authentication procedure. #' Some implementations may allow you to have multiple connections open, so you #' may invoke this function repeatedly assigning its output to different #' objects. #' The authentication mechanism is left unspecified, so check the #' documentation of individual drivers for details. #' Use [dbCanConnect()] to check if a connection can be established. #' #' @template methods #' @templateVar method_name dbConnect #' #' @inherit DBItest::spec_driver_connect return #' @inheritSection DBItest::spec_driver_connect Specification #' #' @param drv An object that inherits from [DBI::DBIDriver][DBIDriver-class], #' or an existing [DBI::DBIConnection][DBIConnection-class] #' object (in order to clone an existing connection). #' @param ... Authentication arguments needed by the DBMS instance; these #' typically include `user`, `password`, `host`, `port`, `dbname`, etc. #' For details see the appropriate `DBIDriver`. #' @seealso [dbDisconnect()] to disconnect from a database. #' @family DBIDriver generics #' @family DBIConnector generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' # SQLite only needs a path to the database. (Here, ":memory:" is a special #' # path that creates an in-memory database.) Other database drivers #' # will require more details (like user, password, host, port, etc.) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' con #' #' dbListTables(con) #' #' dbDisconnect(con) #' #' # Bad, for subtle reasons: #' # This code fails when RSQLite isn't loaded yet, #' # because dbConnect() doesn't know yet about RSQLite. #' dbListTables(con <- dbConnect(RSQLite::SQLite(), ":memory:")) setGeneric( "dbConnect", def = function(drv, ...) { otel_local_active_span("dbConnect", drv) standardGeneric("dbConnect") }, valueClass = "DBIConnection" ) DBI/R/dbiDataType_Date.R0000644000176200001440000000016514350241735014331 0ustar liggesusers#' @usage NULL dbiDataType_Date <- function(x) "DATE" setMethod("dbiDataType", signature("Date"), dbiDataType_Date) DBI/R/dbConnect_DBIConnector.R0000644000176200001440000000135514350241735015434 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbConnect_DBIConnector <- function(drv, ...) { dots_args <- list(...) has_name <- names2(dots_args) != "" # Unnamed dots come first (they are not picked up by modifyList()) unnamed_dots <- dots_args[!has_name] # Named dots come last, an extra drv argument is erased silently named_dots <- dots_args[has_name] named_dots$drv <- NULL # Named dots are supplemented with connector args extra_args <- utils::modifyList( dbGetConnectArgs(drv), named_dots ) all_args <- c( list(drv = drv@.drv), unnamed_dots, extra_args ) do.call(dbConnect, all_args) } #' @rdname hidden_aliases #' @export setMethod("dbConnect", signature("DBIConnector"), dbConnect_DBIConnector) DBI/R/00-Id.R0000644000176200001440000000412115071142015011737 0ustar liggesusersNULL #' @rdname Id setClass("Id", slots = list(name = "character")) #' Refer to a table nested in a hierarchy (e.g. within a schema) #' #' @description #' Objects of class `Id` have a single slot `name`, which is a character vector. #' The [dbQuoteIdentifier()] method converts `Id` objects to strings. #' Support for `Id` objects depends on the database backend. #' #' They can be used in the following methods as `name` or `table` argument: #' #' - [dbCreateTable()] #' - [dbAppendTable()] #' - [dbReadTable()] #' - [dbWriteTable()] #' - [dbExistsTable()] #' - [dbRemoveTable()] #' #' Objects of this class are also returned from [dbListObjects()]. #' #' @param ... Components of the hierarchy, e.g. `cluster`, #' `catalog`, `schema`, or `table`, depending on the database backend. For more #' on these concepts, see #' @export #' @examples #' # Identifies a table in a specific schema: #' Id("dbo", "Customer") #' # You can name the components if you want, but it's not needed #' Id(table = "Customer", schema = "dbo") #' #' # Create a SQL expression for an identifier: #' dbQuoteIdentifier(ANSI(), Id("nycflights13", "flights")) #' #' # Write a table in a specific schema: #' \dontrun{ #' dbWriteTable(con, Id("myschema", "mytable"), data.frame(a = 1)) #' } Id <- function(...) { components <- orderIdParams(...) if (!is.character(components)) { stop("All elements of `...` must be strings.", call. = FALSE) } new("Id", name = components) } #' @export toString.Id <- function(x, ...) { paste0(" ", dbQuoteIdentifier(ANSI(), x)) } dbQuoteIdentifier_DBIConnection_Id <- function(conn, x, ...) { SQL(paste0(dbQuoteIdentifier(conn, x@name), collapse = ".")) } orderIdParams <- function( ..., database = NULL, db = NULL, catalog = NULL, cluster = NULL, schema = NULL, table = NULL, column = NULL ) { out <- c( database = database, db = db, cluster = cluster, catalog = catalog, schema = schema, ..., table = table, column = column ) if (all(names(out) == "")) { out <- unname(out) } out } DBI/R/dbWithTransaction.R0000644000176200001440000000465015071142015014624 0ustar liggesusers#' Self-contained SQL transactions #' #' Given that \link{transactions} are implemented, this function #' allows you to pass in code that is run in a transaction. #' The default method of `dbWithTransaction()` calls [dbBegin()] #' before executing the code, #' and [dbCommit()] after successful completion, #' or [dbRollback()] in case of an error. #' The advantage is #' that you don't have to remember to do `dbBegin()` and `dbCommit()` or #' `dbRollback()` -- that is all taken care of. #' The special function `dbBreak()` allows an early exit with rollback, #' it can be called only inside `dbWithTransaction()`. #' #' DBI implements `dbWithTransaction()`, backends should need to override this #' generic only if they implement specialized handling. #' #' @template methods #' @templateVar method_name dbWithTransaction #' #' @inherit DBItest::spec_transaction_with_transaction return #' @inheritSection DBItest::spec_transaction_with_transaction Failure modes #' @inheritSection DBItest::spec_transaction_with_transaction Specification #' #' @inheritParams dbGetQuery #' @param code An arbitrary block of R code. #' #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "cash", data.frame(amount = 100)) #' dbWriteTable(con, "account", data.frame(amount = 2000)) #' #' # All operations are carried out as logical unit: #' dbWithTransaction( #' con, #' { #' withdrawal <- 300 #' dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) #' dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) #' } #' ) #' #' # The code is executed as if in the current environment: #' withdrawal #' #' # The changes are committed to the database after successful execution: #' dbReadTable(con, "cash") #' dbReadTable(con, "account") #' #' # Rolling back with dbBreak(): #' dbWithTransaction( #' con, #' { #' withdrawal <- 5000 #' dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) #' dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) #' if (dbReadTable(con, "account")$amount < 0) { #' dbBreak() #' } #' } #' ) #' #' # These changes were not committed to the database: #' dbReadTable(con, "cash") #' dbReadTable(con, "account") #' #' dbDisconnect(con) setGeneric("dbWithTransaction", def = function(conn, code, ...) { standardGeneric("dbWithTransaction") }) DBI/R/dbIsReadOnly_DBIObject.R0000644000176200001440000000027514350241735015330 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbIsReadOnly_DBIObject <- function(dbObj, ...) { FALSE } #' @rdname hidden_aliases setMethod("dbIsReadOnly", "DBIObject", dbIsReadOnly_DBIObject) DBI/R/dbiDataType_ANY.R0000644000176200001440000000036615071142015014076 0ustar liggesusersdbiDataType_ANY <- function(x) { if (inherits(x, "blob")) { return("BLOB") } stop( "Unknown SQL data type for object of class ", paste(class(x), collapse = "/") ) } setMethod("dbiDataType", signature("ANY"), dbiDataType_ANY) DBI/R/DBI-package.R0000644000176200001440000000213115143005033013152 0ustar liggesusers#' @description #' DBI defines an interface for communication between R and relational database #' management systems. #' All classes in this package are virtual and need to be extended by #' the various R/DBMS implementations (so-called *DBI backends*). #' #' @inheritSection DBItest::spec_getting_started Definition #' @inheritSection DBItest::spec_compliance_methods DBI classes and methods #' @inheritSection DBItest::spec_driver_constructor Construction of the DBIDriver object #' #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' RSQLite::SQLite() #' @seealso #' Important generics: [dbConnect()], [dbGetQuery()], #' [dbReadTable()], [dbWriteTable()], [dbDisconnect()] #' #' Formal specification (currently work in progress and incomplete): #' `vignette("spec", package = "DBI")` "_PACKAGE" has_arrow <- function() { requireNamespace("nanoarrow", quietly = TRUE) } require_arrow <- function() { if (has_arrow()) { return(invisible(TRUE)) } stop("The nanoarrow package is required for this functionality.") } .onLoad <- function(libname, pkgname) { otel_cache_tracer() } DBI/R/14-dbSendQuery.R0000644000176200001440000000530315071142015013640 0ustar liggesusers#' Execute a query on a given database connection #' #' The `dbSendQuery()` method only submits and synchronously executes the #' SQL query to the database engine. It does \emph{not} extract any #' records --- for that you need to use the [dbFetch()] method, and #' then you must call [dbClearResult()] when you finish fetching the #' records you need. #' For interactive use, you should almost always prefer [dbGetQuery()]. #' Use [dbSendQueryArrow()] or [dbGetQueryArrow()] instead to retrieve the results #' as an Arrow object. #' #' This method is for `SELECT` queries only. Some backends may #' support data manipulation queries through this method for compatibility #' reasons. However, callers are strongly encouraged to use #' [dbSendStatement()] for data manipulation statements. #' #' The query is submitted to the database server and the DBMS executes it, #' possibly generating vast amounts of data. Where these data live #' is driver-specific: some drivers may choose to leave the output on the server #' and transfer them piecemeal to R, others may transfer all the data to the #' client -- but not necessarily to the memory that R manages. See individual #' drivers' `dbSendQuery()` documentation for details. #' #' @inheritSection dbBind The data retrieval flow #' #' @template methods #' @templateVar method_name dbSendQuery #' #' @inherit DBItest::spec_result_send_query return #' @inheritSection DBItest::spec_result_send_query Failure modes #' @inheritSection DBItest::spec_result_send_query Additional arguments #' @inheritSection DBItest::spec_result_send_query Specification #' @inheritSection DBItest::spec_result_send_query Specification for the `immediate` argument #' #' @inheritParams dbGetQuery #' @param statement a character string containing SQL. #' #' @family DBIConnection generics #' @family data retrieval generics #' @seealso For updates: [dbSendStatement()] and [dbExecute()]. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") #' dbFetch(rs) #' dbClearResult(rs) #' #' # Pass one set of values with the param argument: #' rs <- dbSendQuery( #' con, #' "SELECT * FROM mtcars WHERE cyl = ?", #' params = list(4L) #' ) #' dbFetch(rs) #' dbClearResult(rs) #' #' # Pass multiple sets of values with dbBind(): #' rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = ?") #' dbBind(rs, list(6L)) #' dbFetch(rs) #' dbBind(rs, list(8L)) #' dbFetch(rs) #' dbClearResult(rs) #' #' dbDisconnect(con) #' @export setGeneric( "dbSendQuery", def = function(conn, statement, ...) standardGeneric("dbSendQuery"), valueClass = "DBIResult" ) DBI/R/dbFetch.R0000644000176200001440000000364015071142015012532 0ustar liggesusers#' Fetch records from a previously executed query #' #' Fetch the next `n` elements (rows) from the result set and return them #' as a data.frame. #' #' `fetch()` is provided for compatibility with older DBI clients - for all #' new code you are strongly encouraged to use `dbFetch()`. The default #' implementation for `dbFetch()` calls `fetch()` so that it is compatible with #' existing code. Modern backends should implement for `dbFetch()` only. #' #' @inheritSection dbBind The data retrieval flow #' #' @template methods #' @templateVar method_name dbFetch #' #' @inherit DBItest::spec_result_fetch return #' @inheritSection DBItest::spec_result_fetch Failure modes #' @inheritSection DBItest::spec_result_fetch Specification #' @inheritSection DBItest::spec_result_roundtrip Specification #' #' @param res An object inheriting from [DBI::DBIResult][DBIResult-class], #' created by [dbSendQuery()]. #' @param n maximum number of records to retrieve per fetch. Use `n = -1` #' or `n = Inf` #' to retrieve all pending records. Some implementations may recognize other #' special values. #' @param ... Other arguments passed on to methods. #' @seealso Close the result set with [dbClearResult()] as soon as you #' finish retrieving the records you want. #' @family DBIResult generics #' @family data retrieval generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' #' # Fetch all results #' rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") #' dbFetch(rs) #' dbClearResult(rs) #' #' # Fetch in chunks #' rs <- dbSendQuery(con, "SELECT * FROM mtcars") #' while (!dbHasCompleted(rs)) { #' chunk <- dbFetch(rs, 10) #' print(nrow(chunk)) #' } #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbFetch", def = function(res, n = -1, ...) standardGeneric("dbFetch"), valueClass = "data.frame" ) DBI/R/dbListConnections.R0000644000176200001440000000072715071142015014622 0ustar liggesusers#' List currently open connections #' #' DEPRECATED, drivers are no longer required to implement this method. #' Keep track of the connections you opened if you require a list. #' #' @param drv A object inheriting from [DBIDriver-class] #' @param ... Other arguments passed on to methods. #' @family DBIDriver generics #' @keywords internal #' @export #' @return a list setGeneric("dbListConnections", def = function(drv, ...) { standardGeneric("dbListConnections") }) DBI/R/sqlData_DBIConnection.R0000644000176200001440000000133314350241735015267 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL sqlData_DBIConnection <- function(con, value, row.names = NA, ...) { value <- sqlRownamesToColumn(value, row.names) # Convert factors to strings is_factor <- vapply(value, is.factor, logical(1)) value[is_factor] <- lapply(value[is_factor], as.character) # Quote all strings is_char <- vapply(value, is.character, logical(1)) value[is_char] <- lapply(value[is_char], function(x) { enc2utf8(dbQuoteString(con, x)) }) # Convert everything to character and turn NAs into NULL value[!is_char] <- lapply(value[!is_char], dbQuoteLiteral, conn = con) value } #' @rdname hidden_aliases #' @export setMethod("sqlData", signature("DBIConnection"), sqlData_DBIConnection) DBI/R/dbRemoveTable.R0000644000176200001440000000217715144400570013716 0ustar liggesusers#' Remove a table from the database #' #' Remove a remote table (e.g., created by [dbWriteTable()]) #' from the database. #' #' @template methods #' @templateVar method_name dbRemoveTable #' #' @inherit DBItest::spec_sql_remove_table return #' @inheritSection DBItest::spec_sql_remove_table Failure modes #' @inheritSection DBItest::spec_sql_remove_table Additional arguments #' @inheritSection DBItest::spec_sql_remove_table Specification #' #' @inheritParams dbReadTable #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbExistsTable(con, "iris") #' dbWriteTable(con, "iris", iris) #' dbExistsTable(con, "iris") #' dbRemoveTable(con, "iris") #' dbExistsTable(con, "iris") #' #' dbDisconnect(con) setGeneric("dbRemoveTable", def = function(conn, name, ...) { otel_local_active_span( "DROP TABLE", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn), db.operation.name = "DROP TABLE" ) ) standardGeneric("dbRemoveTable") }) DBI/R/sqlCreateTable.R0000644000176200001440000000346215071142015014070 0ustar liggesusers#' Compose query to create a simple table #' #' Exposes an interface to simple `CREATE TABLE` commands. The default #' method is ANSI SQL 99 compliant. #' This method is mostly useful for backend implementers. #' #' The `row.names` argument must be passed explicitly in order to avoid #' a compatibility warning. The default will be changed in a later release. #' #' @param con A database connection. #' @param table The table name, passed on to [dbQuoteIdentifier()]. Options are: #' - a character string with the unquoted DBMS table name, #' e.g. `"table_name"`, #' - a call to [Id()] with components to the fully qualified table name, #' e.g. `Id(schema = "my_schema", table = "table_name")` #' - a call to [SQL()] with the quoted and fully qualified table name #' given verbatim, e.g. `SQL('"my_schema"."table_name"')` #' @param fields Either a character vector or a data frame. #' #' A named character vector: Names are column names, values are types. #' Names are escaped with [dbQuoteIdentifier()]. #' Field types are unescaped. #' #' A data frame: field types are generated using #' [dbDataType()]. #' @param temporary If `TRUE`, will generate a temporary table. #' @inheritParams rownames #' @param ... Other arguments used by individual methods. #' #' @template methods #' @templateVar method_name sqlCreateTable #' #' @export #' @examples #' sqlCreateTable(ANSI(), "my-table", c(a = "integer", b = "text")) #' sqlCreateTable(ANSI(), "my-table", iris) #' #' # By default, character row names are converted to a row_names colum #' sqlCreateTable(ANSI(), "mtcars", mtcars[, 1:5]) #' sqlCreateTable(ANSI(), "mtcars", mtcars[, 1:5], row.names = FALSE) setGeneric( "sqlCreateTable", def = function(con, table, fields, row.names = NA, temporary = FALSE, ...) { standardGeneric("sqlCreateTable") } ) DBI/R/dbBind_DBIResultArrow.R0000644000176200001440000000041214602466070015250 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbBind_DBIResultArrow <- function(res, params, ...) { dbBind(res@result, params = params, ...) invisible(res) } #' @rdname hidden_aliases #' @export setMethod("dbBind", signature("DBIResultArrow"), dbBind_DBIResultArrow) DBI/R/sqlAppendTableTemplate.R0000644000176200001440000000300515071142015015561 0ustar liggesusers#' @rdname sqlAppendTable #' @inheritParams sqlCreateTable #' @inheritParams rownames #' @param prefix Parameter prefix to use for placeholders. #' @param pattern Parameter pattern to use for placeholders: #' - `""`: no pattern #' - `"1"`: position #' - anything else: field name #' @export #' @examples #' sqlAppendTableTemplate(ANSI(), "iris", iris) #' #' sqlAppendTableTemplate(ANSI(), "mtcars", mtcars) #' sqlAppendTableTemplate(ANSI(), "mtcars", mtcars, row.names = FALSE) sqlAppendTableTemplate <- function( con, table, values, row.names = NA, prefix = "?", ..., pattern = "" ) { if (missing(row.names)) { warning( "Do not rely on the default value of the `row.names` argument to `sqlAppendTableTemplate()`, it will change in the future.", call. = FALSE ) } if (length(values) == 0) { stop("Must pass at least one column in `values`", call. = FALSE) } table <- dbQuoteIdentifier(con, table) if (length(table) != 1) { stop("Must pass one table name", call. = FALSE) } values <- sqlRownamesToColumn(values[0, , drop = FALSE], row.names) fields <- dbQuoteIdentifier(con, names(values)) if (pattern == "") { suffix <- rep("", length(fields)) } else if (pattern == "1") { suffix <- as.character(seq_along(fields)) } else { suffix <- names(fields) } placeholders <- lapply(paste0(prefix, suffix), SQL) names(placeholders) <- names(values) sqlAppendTable( con = con, table = table, values = placeholders, row.names = row.names ) } DBI/R/dbGetException.R0000644000176200001440000000073615071142015014102 0ustar liggesusers#' Get DBMS exceptions #' #' DEPRECATED. Backends should use R's condition system to signal errors and #' warnings. #' #' @inheritParams dbGetQuery #' @family DBIConnection generics #' @return a list with elements `errorNum` (an integer error number) and #' `errorMsg` (a character string) describing the last error in the #' connection `conn`. #' @export #' @keywords internal setGeneric("dbGetException", def = function(conn, ...) { standardGeneric("dbGetException") }) DBI/R/dbiDataType_character.R0000644000176200001440000000030115071142015015370 0ustar liggesusersdbiDataType_character <- function(x) { "TEXT" } setMethod("dbiDataType", signature("character"), dbiDataType_character) setMethod("dbiDataType", signature("factor"), dbiDataType_character) DBI/R/dbGetInfo_DBIResultArrow.R0000644000176200001440000000036014602466070015731 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetInfo_DBIResultArrow <- function(dbObj, ...) { dbGetInfo(dbObj@result, ...) } #' @rdname hidden_aliases #' @export setMethod("dbGetInfo", signature("DBIResultArrow"), dbGetInfo_DBIResultArrow) DBI/R/dbiDataType_logical.R0000644000176200001440000000020214350241735015056 0ustar liggesusers#' @usage NULL dbiDataType_logical <- function(x) "SMALLINT" setMethod("dbiDataType", signature("logical"), dbiDataType_logical) DBI/R/SQLKeywords_missing.R0000644000176200001440000000034615071142015015113 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL SQLKeywords_missing <- function(dbObj, ...) .SQL92Keywords #' @rdname hidden_aliases setMethod( "SQLKeywords", signature("missing"), SQLKeywords_missing, valueClass = "character" ) DBI/R/show_DBIDriver.R0000644000176200001440000000061114350241735014010 0ustar liggesusers#' @rdname hidden_aliases #' @param object Object to display #' @usage NULL show_DBIDriver <- function(object) { tryCatch( # to protect drivers that fail to implement the required methods (e.g., # RPostgreSQL) show_driver(object), error = function(e) NULL ) invisible(NULL) } #' @rdname hidden_aliases #' @export setMethod("show", signature("DBIDriver"), show_DBIDriver) DBI/R/dbDataType_DBIObject.R0000644000176200001440000000033514350241735015027 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbDataType_DBIObject <- function(dbObj, obj, ...) { dbiDataType(obj) } #' @rdname hidden_aliases #' @export setMethod("dbDataType", signature("DBIObject"), dbDataType_DBIObject) DBI/R/SQL.R0000644000176200001440000000403614350241735011642 0ustar liggesusers#' SQL quoting #' #' This set of classes and generics make it possible to flexibly deal with SQL #' escaping needs. By default, any user supplied input to a query should be #' escaped using either [dbQuoteIdentifier()] or [dbQuoteString()] #' depending on whether it refers to a table or variable name, or is a literal #' string. #' These functions may return an object of the `SQL` class, #' which tells DBI functions that a character string does not need to be escaped #' anymore, to prevent double escaping. #' The `SQL` class has associated the `SQL()` constructor function. #' #' @section Implementation notes: #' #' DBI provides default generics for SQL-92 compatible quoting. If the database #' uses a different convention, you will need to provide your own methods. #' Note that because of the way that S4 dispatch finds methods and because #' SQL inherits from character, if you implement (e.g.) a method for #' `dbQuoteString(MyConnection, character)`, you will also need to #' implement `dbQuoteString(MyConnection, SQL)` - this should simply #' return `x` unchanged. #' #' @param x A character vector to label as being escaped SQL. #' @param ... Other arguments passed on to methods. Not otherwise used. #' @param names Names for the returned object, must have the same length as `x`. #' @return An object of class `SQL`. #' @export #' @examples #' dbQuoteIdentifier(ANSI(), "SELECT") #' dbQuoteString(ANSI(), "SELECT") #' #' # SQL vectors are always passed through as is #' var_name <- SQL("SELECT") #' var_name #' #' dbQuoteIdentifier(ANSI(), var_name) #' dbQuoteString(ANSI(), var_name) #' #' # This mechanism is used to prevent double escaping #' dbQuoteString(ANSI(), dbQuoteString(ANSI(), "SELECT")) SQL <- function(x, ..., names = NULL) { if (!is.null(names)) { stopifnot(length(x) == length(names)) } names(x) <- names new("SQL", x) } #' @rdname SQL #' @export #' @aliases #' SQL-class setClass("SQL", contains = "character") #' @export `[.SQL` <- function(x, ...) SQL(NextMethod()) #' @export `[[.SQL` <- function(x, ...) SQL(NextMethod()) DBI/R/03-DBIConnection.R0000644000176200001440000000217615005150137014035 0ustar liggesusers#' DBIConnection class #' #' This virtual class encapsulates the connection to a DBMS, and it provides #' access to dynamic queries, result sets, DBMS session management #' (transactions), etc. #' #' @section Implementation note: #' Individual drivers are free to implement single or multiple simultaneous #' connections. #' #' @docType class #' @name DBIConnection-class #' @family DBI classes #' @family DBIConnection generics #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' con #' dbDisconnect(con) #' \dontrun{ #' con <- dbConnect(RPostgreSQL::PostgreSQL(), "username", "password") #' con #' dbDisconnect(con) #' } #' @export setClass("DBIConnection", contains = c("DBIObject", "VIRTUAL")) show_connection <- function(object) { cat("<", is(object)[1], ">\n", sep = "") if (!dbIsValid(object)) { cat(" DISCONNECTED\n") } } list_fields <- function(conn, name) { rs <- dbSendQuery( conn, paste( "SELECT * FROM ", dbQuoteIdentifier(conn, name), "LIMIT 0" ) ) on.exit(dbClearResult(rs)) names(dbFetch(rs, n = 0, row.names = FALSE)) } DBI/R/dbGetConnectArgs.R0000644000176200001440000000175715071142015014356 0ustar liggesusers#' Get connection arguments #' #' Returns the arguments stored in a [DBIConnector-class] object for inspection, #' optionally evaluating them. #' This function is called by [dbConnect()] #' and usually does not need to be called directly. #' #' @template methods #' @templateVar method_name dbGetConnectArgs #' #' @param drv A object inheriting from [DBIConnector-class]. #' @param eval Set to `FALSE` to return the functions that generate the argument #' instead of evaluating them. #' @param ... Other arguments passed on to methods. Not otherwise used. #' @family DBIConnector generics #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' cnr <- new("DBIConnector", #' .drv = RSQLite::SQLite(), #' .conn_args = list(dbname = ":memory:", password = function() "supersecret") #' ) #' dbGetConnectArgs(cnr) #' dbGetConnectArgs(cnr, eval = FALSE) #' @export setGeneric( "dbGetConnectArgs", def = function(drv, eval = TRUE, ...) standardGeneric("dbGetConnectArgs"), valueClass = "list" ) DBI/R/dbListObjects.R0000644000176200001440000000271515071142015013730 0ustar liggesusers#' List remote objects #' #' Returns the names of remote objects accessible through this connection #' as a data frame. #' This should include temporary objects, but not all database backends #' (in particular \pkg{RMariaDB} and \pkg{RMySQL}) support this. #' Compared to [dbListTables()], this method also enumerates tables and views #' in schemas, and returns fully qualified identifiers to access these objects. #' This allows exploration of all database objects available to the current #' user, including those that can only be accessed by giving the full #' namespace. #' #' @template methods #' @templateVar method_name dbListObjects #' #' @inherit DBItest::spec_sql_list_objects return #' @inheritSection DBItest::spec_sql_list_objects Failure modes #' @inheritSection DBItest::spec_sql_list_objects Specification #' #' @inheritParams dbGetQuery #' @param prefix A fully qualified path in the database's namespace, or `NULL`. #' This argument will be processed with [dbUnquoteIdentifier()]. #' If given the method will return all objects accessible through this prefix. #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbListObjects(con) #' dbWriteTable(con, "mtcars", mtcars) #' dbListObjects(con) #' #' dbDisconnect(con) setGeneric( "dbListObjects", def = function(conn, prefix = NULL, ...) standardGeneric("dbListObjects"), valueClass = "data.frame" ) DBI/R/dbListFields.R0000644000176200001440000000147215071142015013544 0ustar liggesusers#' List field names of a remote table #' #' Returns the field names of a remote table as a character vector. #' #' @inheritParams dbReadTable #' #' @template methods #' @templateVar method_name dbListFields #' #' @inherit DBItest::spec_sql_list_fields return #' @inheritSection DBItest::spec_sql_list_fields Failure modes #' @inheritSection DBItest::spec_sql_list_fields Specification #' #' @family DBIConnection generics #' @seealso [dbColumnInfo()] to get the type of the fields. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' dbListFields(con, "mtcars") #' #' dbDisconnect(con) setGeneric( "dbListFields", def = function(conn, name, ...) standardGeneric("dbListFields"), valueClass = "character" ) DBI/R/dbUnquoteIdentifier.R0000644000176200001440000000243515071142015015145 0ustar liggesusers#' Unquote identifiers #' #' Call this method to convert a [SQL] object created by [dbQuoteIdentifier()] #' back to a list of [Id] objects. #' #' @inheritParams dbGetQuery #' @param x An [SQL] or [Id] object. #' @param ... Other arguments passed on to methods. #' #' @template methods #' @templateVar method_name dbUnquoteIdentifier #' #' @inherit DBItest::spec_sql_unquote_identifier return #' @inheritSection DBItest::spec_sql_unquote_identifier Failure modes #' @inheritSection DBItest::spec_sql_unquote_identifier Specification #' #' @family DBIConnection generics #' @export #' @examples #' # Unquoting allows to understand the structure of a #' # possibly complex quoted identifier #' dbUnquoteIdentifier( #' ANSI(), #' SQL(c('"Catalog"."Schema"."Table"', '"Schema"."Table"', '"UnqualifiedTable"')) #' ) #' #' # The returned object is always a list, #' # also for Id objects #' dbUnquoteIdentifier(ANSI(), Id("Catalog", "Schema", "Table")) #' #' # Quoting and unquoting are inverses #' dbQuoteIdentifier( #' ANSI(), #' dbUnquoteIdentifier(ANSI(), SQL("UnqualifiedTable"))[[1]] #' ) #' #' dbQuoteIdentifier( #' ANSI(), #' dbUnquoteIdentifier(ANSI(), Id("Schema", "Table"))[[1]] #' ) setGeneric("dbUnquoteIdentifier", def = function(conn, x, ...) { standardGeneric("dbUnquoteIdentifier") }) DBI/R/dbColumnInfo.R0000644000176200001440000000202015071142015013541 0ustar liggesusers#' Information about result types #' #' Produces a data.frame that describes the output of a query. The data.frame #' should have as many rows as there are output fields in the result set, and #' each column in the data.frame describes an aspect of the result set #' field (field name, type, etc.) #' #' @inheritSection dbBind The data retrieval flow #' #' @inheritParams dbClearResult #' #' @template methods #' @templateVar method_name dbColumnInfo #' #' @inherit DBItest::spec_meta_column_info return #' @inheritSection DBItest::spec_meta_column_info Failure modes #' @inheritSection DBItest::spec_meta_column_info Specification #' #' @family DBIResult generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' rs <- dbSendQuery(con, "SELECT 1 AS a, 2 AS b") #' dbColumnInfo(rs) #' dbFetch(rs) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbColumnInfo", def = function(res, ...) standardGeneric("dbColumnInfo"), valueClass = "data.frame" ) DBI/R/deprecated.R0000644000176200001440000001125715071142015013276 0ustar liggesusersNULL ## produce legal SQL identifiers from strings in a character vector ## unique, in this function, means unique regardless of lower/upper case #' @rdname make.db.names #' @export make.db.names.default <- function( snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE ) { makeUnique <- function(x, sep = "_") { if (length(x) == 0) { return(x) } out <- x lc <- make.names(tolower(x), unique = FALSE) i <- duplicated(lc) lc <- make.names(lc, unique = TRUE) out[i] <- paste( out[i], substring(lc[i], first = nchar(out[i]) + 1), sep = sep ) out } ## Note: SQL identifiers *can* be enclosed in double or single quotes ## when they are equal to reserverd keywords. fc <- substring(snames, 1, 1) lc <- substring(snames, nchar(snames)) i <- match(fc, c("'", '"'), 0) > 0 & match(lc, c("'", '"'), 0) > 0 snames[!i] <- make.names(snames[!i], unique = FALSE) if (unique) { snames[!i] <- makeUnique(snames[!i]) } if (!allow.keywords) { kwi <- match(keywords, toupper(snames), nomatch = 0L) snames[kwi] <- paste('"', snames[kwi], '"', sep = "") } gsub("\\.", "_", snames) } #' @rdname make.db.names #' @export isSQLKeyword.default <- function( name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3] ) { n <- pmatch(case, c("lower", "upper", "any"), nomatch = 0) if (n == 0) { stop('case must be one of "lower", "upper", or "any"') } kw <- switch( c("lower", "upper", "any")[n], lower = tolower(keywords), upper = toupper(keywords), any = toupper(keywords) ) if (n == 3) { name <- toupper(name) } match(name, keywords, nomatch = 0) > 0 } #' Keywords according to the SQL-92 standard #' #' A character vector of SQL-92 keywords, uppercase. #' #' @export #' @examples #' "SELECT" %in% .SQL92Keywords .SQL92Keywords <- c( "ABSOLUTE", "ADD", "ALL", "ALLOCATE", "ALTER", "AND", "ANY", "ARE", "AS", "ASC", "ASSERTION", "AT", "AUTHORIZATION", "AVG", "BEGIN", "BETWEEN", "BIT", "BIT_LENGTH", "BY", "CASCADE", "CASCADED", "CASE", "CAST", "CATALOG", "CHAR", "CHARACTER", "CHARACTER_LENGTH", "CHAR_LENGTH", "CHECK", "CLOSE", "COALESCE", "COLLATE", "COLLATION", "COLUMN", "COMMIT", "CONNECT", "CONNECTION", "CONSTRAINT", "CONSTRAINTS", "CONTINUE", "CONVERT", "CORRESPONDING", "COUNT", "CREATE", "CURRENT", "CURRENT_DATE", "CURRENT_TIMESTAMP", "CURRENT_TYPE", "CURSOR", "DATE", "DAY", "DEALLOCATE", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DESC", "DESCRIBE", "DESCRIPTOR", "DIAGNOSTICS", "DICONNECT", "DICTIONATRY", "DISPLACEMENT", "DISTINCT", "DOMAIN", "DOUBLE", "DROP", "ELSE", "END", "END-EXEC", "ESCAPE", "EXCEPT", "EXCEPTION", "EXEC", "EXECUTE", "EXISTS", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIRST", "FLOAT", "FOR", "FOREIGN", "FOUND", "FROM", "FULL", "GET", "GLOBAL", "GO", "GOTO", "GRANT", "GROUP", "HAVING", "HOUR", "IDENTITY", "IGNORE", "IMMEDIATE", "IN", "INCLUDE", "INDEX", "INDICATOR", "INITIALLY", "INNER", "INPUT", "INSENSITIVE", "INSERT", "INT", "INTEGER", "INTERSECT", "INTERVAL", "INTO", "IS", "ISOLATION", "JOIN", "KEY", "LANGUAGE", "LAST", "LEFT", "LEVEL", "LIKE", "LOCAL", "LOWER", "MATCH", "MAX", "MIN", "MINUTE", "MODULE", "MONTH", "NAMES", "NATIONAL", "NCHAR", "NEXT", "NOT", "NULL", "NULLIF", "NUMERIC", "OCTECT_LENGTH", "OF", "OFF", "ONLY", "OPEN", "OPTION", "OR", "ORDER", "OUTER", "OUTPUT", "OVERLAPS", "PARTIAL", "POSITION", "PRECISION", "PREPARE", "PRESERVE", "PRIMARY", "PRIOR", "PRIVILEGES", "PROCEDURE", "PUBLIC", "READ", "REAL", "REFERENCES", "RESTRICT", "REVOKE", "RIGHT", "ROLLBACK", "ROWS", "SCHEMA", "SCROLL", "SECOND", "SECTION", "SELECT", "SET", "SIZE", "SMALLINT", "SOME", "SQL", "SQLCA", "SQLCODE", "SQLERROR", "SQLSTATE", "SQLWARNING", "SUBSTRING", "SUM", "SYSTEM", "TABLE", "TEMPORARY", "THEN", "TIME", "TIMESTAMP", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TO", "TRANSACTION", "TRANSLATE", "TRANSLATION", "TRUE", "UNION", "UNIQUE", "UNKNOWN", "UPDATE", "UPPER", "USAGE", "USER", "USING", "VALUE", "VALUES", "VARCHAR", "VARYING", "VIEW", "WHEN", "WHENEVER", "WHERE", "WITH", "WORK", "WRITE", "YEAR", "ZONE" ) #' Determine the current version of the package. #' #' @export #' @keywords internal dbGetDBIVersion <- function() { .Deprecated("packageVersion('DBI')") utils::packageVersion("DBI") } DBI/R/dbGetQuery.R0000644000176200001440000000514215143005033013243 0ustar liggesusers#' Retrieve results from a query #' #' Returns the result of a query as a data frame. #' `dbGetQuery()` comes with a default implementation #' (which should work with most backends) that calls #' [dbSendQuery()], then [dbFetch()], ensuring that #' the result is always freed by [dbClearResult()]. #' For retrieving chunked/paged results or for passing query parameters, #' see [dbSendQuery()], in particular the "The data retrieval flow" section. #' For retrieving results as an Arrow object, see [dbGetQueryArrow()]. #' #' This method is for `SELECT` queries only #' (incl. other SQL statements that return a `SELECT`-alike result, #' e.g., execution of a stored procedure or data manipulation queries #' like `INSERT INTO ... RETURNING ...`). #' To execute a stored procedure that does not return a result set, #' use [dbExecute()]. #' #' Some backends may #' support data manipulation statements through this method for compatibility #' reasons. However, callers are strongly advised to use #' [dbExecute()] for data manipulation statements. #' #' @template methods #' @templateVar method_name dbGetQuery #' #' @inherit DBItest::spec_result_get_query return #' @inheritSection DBItest::spec_result_get_query Failure modes #' @inheritSection DBItest::spec_result_get_query Additional arguments #' @inheritSection DBItest::spec_result_get_query Specification #' @inheritSection DBItest::spec_result_get_query Specification for the `immediate` argument #' #' @section Implementation notes: #' Subclasses should override this method only if they provide some sort of #' performance optimization. #' #' @param conn A [DBI::DBIConnection][DBIConnection-class] object, #' as returned by [dbConnect()]. #' @param statement a character string containing SQL. #' @param ... Other parameters passed on to methods. #' @family DBIConnection generics #' @family data retrieval generics #' @seealso For updates: [dbSendStatement()] and [dbExecute()]. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' dbGetQuery(con, "SELECT * FROM mtcars") #' dbGetQuery(con, "SELECT * FROM mtcars", n = 6) #' #' # Pass values using the param argument: #' # (This query runs eight times, once for each different #' # parameter. The resulting rows are combined into a single #' # data frame.) #' dbGetQuery( #' con, #' "SELECT COUNT(*) FROM mtcars WHERE cyl = ?", #' params = list(1:8) #' ) #' #' dbDisconnect(con) setGeneric("dbGetQuery", def = function(conn, statement, ...) { otel_query_local_active_span(conn, statement) standardGeneric("dbGetQuery") }) DBI/R/dbRemoveTable_DBIConnection_Id.R0000644000176200001440000000045515071142015017021 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbRemoveTable_DBIConnection_Id <- function(conn, name, ...) { dbRemoveTable(conn, dbQuoteIdentifier(conn, name), ...) } #' @rdname hidden_aliases #' @export setMethod( "dbRemoveTable", signature("DBIConnection", "Id"), dbRemoveTable_DBIConnection_Id ) DBI/R/dbReadTable_DBIConnection_character.R0000644000176200001440000000176515071142015020044 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbReadTable_DBIConnection_character <- function( conn, name, ..., row.names = FALSE, check.names = TRUE ) { sql_name <- dbReadTable_toSqlName(conn, name, ...) if (!is.null(row.names)) { stopifnot(length(row.names) == 1L) stopifnot(is.logical(row.names) || is.character(row.names)) } stopifnot(length(check.names) == 1L) stopifnot(is.logical(check.names)) stopifnot(!is.na(check.names)) out <- dbGetQuery(conn, paste0("SELECT * FROM ", sql_name)) out <- sqlColumnToRownames(out, row.names) if (check.names) { names(out) <- make.names(names(out), unique = TRUE) } out } dbReadTable_toSqlName <- function(conn, name, ...) { sql_name <- dbQuoteIdentifier(conn, x = name, ...) if (length(sql_name) != 1L) { stop("Invalid name: ", format(name), call. = FALSE) } sql_name } #' @rdname hidden_aliases #' @export setMethod( "dbReadTable", signature("DBIConnection", "character"), dbReadTable_DBIConnection_character ) DBI/R/dbIsReadOnly_DBIConnector.R0000644000176200001440000000035114350241735016047 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbIsReadOnly_DBIConnector <- function(dbObj, ...) { dbIsReadOnly(dbObj@.drv, ...) } #' @rdname hidden_aliases setMethod("dbIsReadOnly", signature("DBIConnector"), dbIsReadOnly_DBIConnector) DBI/R/dbGetStatement_DBIResultArrow.R0000644000176200001440000000041015071142015016765 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetStatement_DBIResultArrow <- function(res, ...) { dbGetStatement(res@result, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbGetStatement", signature("DBIResultArrow"), dbGetStatement_DBIResultArrow ) DBI/R/show_SQL.R0000644000176200001440000000033114350241735012674 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL show_SQL <- function(object) { cat(paste0(" ", object@.Data, collapse = "\n"), "\n", sep = "") } #' @rdname hidden_aliases #' @export setMethod("show", "SQL", show_SQL) DBI/R/rownames.R0000644000176200001440000000527315071142015013032 0ustar liggesusers#' Convert row names back and forth between columns #' #' These functions provide a reasonably automatic way of preserving the row #' names of data frame during back-and-forth translation to an SQL table. #' By default, row names will be converted to an explicit column #' called "row_names", and any query returning a column called "row_names" #' will have those automatically set as row names. #' These methods are mostly useful for backend implementers. #' #' @param df A data frame #' @param row.names Either `TRUE`, `FALSE`, `NA` or a string. #' #' If `TRUE`, always translate row names to a column called "row_names". #' If `FALSE`, never translate row names. If `NA`, translate #' rownames only if they're a character vector. #' #' A string is equivalent to `TRUE`, but allows you to override the #' default name. #' #' For backward compatibility, `NULL` is equivalent to `FALSE`. #' @name rownames #' @examples #' # If have row names #' sqlRownamesToColumn(head(mtcars)) #' sqlRownamesToColumn(head(mtcars), FALSE) #' sqlRownamesToColumn(head(mtcars), "ROWNAMES") #' #' # If don't have #' sqlRownamesToColumn(head(iris)) #' sqlRownamesToColumn(head(iris), TRUE) #' sqlRownamesToColumn(head(iris), "ROWNAMES") NULL #' @export #' @rdname rownames sqlRownamesToColumn <- function(df, row.names = NA) { name <- guessRowName(df, row.names) if (is.null(name)) { rownames(df) <- NULL return(df) } rn <- stats::setNames(list(row.names(df)), name) df <- c(rn, df) class(df) <- "data.frame" attr(df, "row.names") <- .set_row_names(length(rn[[1]])) df } #' @export #' @rdname rownames sqlColumnToRownames <- function(df, row.names = NA) { name <- guessColName(df, row.names) if (is.null(name)) { return(df) } if (!(name %in% names(df))) { stop("Column ", name, " not present in output", call. = FALSE) } row.names(df) <- df[[name]] df[[name]] <- NULL df } guessRowName <- function(df, row.names) { if (identical(row.names, TRUE)) { "row_names" } else if (identical(row.names, FALSE) || is.null(row.names)) { NULL } else if (identical(row.names, NA)) { is_char <- is.character(attr(df, "row.names")) if (is_char) { "row_names" } else { NULL } } else if (is.character(row.names)) { row.names[1] } else { stop("Unknown input") } } guessColName <- function(df, row.names) { if (identical(row.names, TRUE)) { "row_names" } else if (identical(row.names, FALSE) || is.null(row.names)) { NULL } else if (identical(row.names, NA)) { if ("row_names" %in% names(df)) { "row_names" } else { NULL } } else if (is.character(row.names)) { row.names[1] } else { stop("Unknown input") } } DBI/R/dbIsValid_DBIResultArrowDefault.R0000644000176200001440000000041015071142015017221 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbIsValid_DBIResultArrowDefault <- function(dbObj, ...) { dbIsValid(dbObj@result) } #' @rdname hidden_aliases #' @export setMethod( "dbIsValid", signature("DBIResultArrowDefault"), dbIsValid_DBIResultArrowDefault ) DBI/R/dbiDataType_numeric.R0000644000176200001440000000020014350241735015104 0ustar liggesusers#' @usage NULL dbiDataType_numeric <- function(x) "DOUBLE" setMethod("dbiDataType", signature("numeric"), dbiDataType_numeric) DBI/R/sqlParseVariables_DBIConnection.R0000644000176200001440000000070415071142015017312 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL sqlParseVariables_DBIConnection <- function(conn, sql, ...) { sqlParseVariablesImpl( sql, list( sqlQuoteSpec('"', '"'), sqlQuoteSpec("'", "'") ), list( sqlCommentSpec("/*", "*/", TRUE), sqlCommentSpec("--", "\n", FALSE) ) ) } #' @rdname hidden_aliases #' @export setMethod( "sqlParseVariables", signature("DBIConnection"), sqlParseVariables_DBIConnection ) DBI/R/dbiDataType_default.R0000644000176200001440000000041515071142015015066 0ustar liggesusersdbiDataType_default <- function(x) { if (inherits(x, c("blob", "arrow_binary"))) { return("BLOB") } stop( "SQL type unknown for objects of class ", paste(class(x), collapse = "/") ) } setMethod("dbiDataType", signature("ANY"), dbiDataType_default) DBI/R/sqlAppendTable_DBIConnection.R0000644000176200001440000000163015071142015016565 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL sqlAppendTable_DBIConnection <- function( con, table, values, row.names = NA, ... ) { stopifnot(is.list(values)) if (missing(row.names)) { warning( "Do not rely on the default value of the row.names argument for sqlAppendTable(), it will change in the future.", call. = FALSE ) } sql_values <- sqlData(con, values, row.names) table <- dbQuoteIdentifier(con, table) fields <- dbQuoteIdentifier(con, names(sql_values)) # Convert fields into a character matrix rows <- do.call(paste, c(unname(sql_values), sep = ", ")) SQL(paste0( "INSERT INTO ", table, "\n", " (", paste(fields, collapse = ", "), ")\n", "VALUES\n", paste0(" (", rows, ")", collapse = ",\n") )) } #' @rdname hidden_aliases #' @export setMethod( "sqlAppendTable", signature("DBIConnection"), sqlAppendTable_DBIConnection ) DBI/R/dbFetchArrowChunk_DBIResultArrow.R0000644000176200001440000000047215071142015017426 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbFetchArrowChunk_DBIResultArrow <- function(res, ...) { nanoarrow::as_nanoarrow_array( dbFetch(res@result, n = 256, ...) ) } #' @rdname hidden_aliases #' @export setMethod( "dbFetchArrowChunk", signature("DBIResultArrow"), dbFetchArrowChunk_DBIResultArrow ) DBI/R/dbQuoteString.R0000644000176200001440000000225715071142015013770 0ustar liggesusers#' Quote literal strings #' #' Call this method to generate a string that is suitable for #' use in a query as a string literal, to make sure that you #' generate valid SQL and protect against SQL injection attacks. #' #' @inheritParams dbGetQuery #' @param x A character vector to quote as string. #' @param ... Other arguments passed on to methods. #' #' @template methods #' @templateVar method_name dbQuoteString #' #' @inherit DBItest::spec_sql_quote_string return #' @inheritSection DBItest::spec_sql_quote_string Failure modes #' @inheritSection DBItest::spec_sql_quote_string Specification #' #' @family DBIResult generics #' @export #' @examples #' # Quoting ensures that arbitrary input is safe for use in a query #' name <- "Robert'); DROP TABLE Students;--" #' dbQuoteString(ANSI(), name) #' #' # NAs become NULL #' dbQuoteString(ANSI(), c("x", NA)) #' #' # SQL vectors are always passed through as is #' var_name <- SQL("select") #' var_name #' dbQuoteString(ANSI(), var_name) #' #' # This mechanism is used to prevent double escaping #' dbQuoteString(ANSI(), dbQuoteString(ANSI(), name)) setGeneric("dbQuoteString", def = function(conn, x, ...) { standardGeneric("dbQuoteString") }) DBI/R/hms.R0000644000176200001440000000406315071142015011762 0ustar liggesusers# from hms format_hms <- function(x) { units(x) <- "secs" xx <- decompose(x) ifelse( is.na(x), NA_character_, paste0( ifelse(xx$sign, "-", ""), format_hours(xx$hours), ":", format_two_digits(xx$minute_of_hour), ":", format_two_digits(xx$second_of_minute), format_tics(xx$tics) ) ) } format_hours <- function(x) { # Difference to hms: don't justify here format_two_digits(x) } format_two_digits <- function(x) { formatC(x, format = "f", digits = 0, width = 2, flag = "0") } format_tics <- function(x) { x <- x / TICS_PER_SECOND out <- format(x, scientific = FALSE, digits = SPLIT_SECOND_DIGITS + 1L) digits <- max(min(max(nchar(out) - 2), SPLIT_SECOND_DIGITS), 0) out <- formatC(x, format = "f", digits = digits) gsub("^0", "", out) } SPLIT_SECOND_DIGITS <- 6L TICS_PER_SECOND <- 10^SPLIT_SECOND_DIGITS SECONDS_PER_MINUTE <- 60 MINUTES_PER_HOUR <- 60 HOURS_PER_DAY <- 24 TICS_PER_MINUTE <- SECONDS_PER_MINUTE * TICS_PER_SECOND TICS_PER_HOUR <- MINUTES_PER_HOUR * TICS_PER_MINUTE TICS_PER_DAY <- HOURS_PER_DAY * TICS_PER_HOUR days <- function(x) { trunc(x / TICS_PER_DAY) } hours <- function(x) { trunc(x / TICS_PER_HOUR) } hour_of_day <- function(x) { abs(hours(x) - days(x) * HOURS_PER_DAY) } minutes <- function(x) { trunc(x / TICS_PER_MINUTE) } minute_of_hour <- function(x) { abs(minutes(x) - hours(x) * MINUTES_PER_HOUR) } seconds <- function(x) { trunc(x / TICS_PER_SECOND) } second_of_minute <- function(x) { abs(seconds(x) - minutes(x) * SECONDS_PER_MINUTE) } tics <- function(x) { x } tic_of_second <- function(x) { abs(tics(x) - seconds(x) * TICS_PER_SECOND) } decompose <- function(x) { x <- unclass(x) * TICS_PER_SECOND # #140 xr <- round(x) out <- list( sign = xr < 0 & !is.na(xr), hours = abs(hours(xr)), minute_of_hour = minute_of_hour(xr), second_of_minute = second_of_minute(xr), tics = tic_of_second(xr) ) # #140: Make sure zeros are printed fake_zero <- (out$tics == 0) & (xr != x) out$tics[fake_zero] <- 0.25 out } DBI/R/dbDataType.R0000644000176200001440000000500015071142015013204 0ustar liggesusers#' Determine the SQL data type of an object #' #' Returns an SQL string that describes the SQL data type to be used for an #' object. #' The default implementation of this generic determines the SQL type of an #' R object according to the SQL 92 specification, which may serve as a starting #' point for driver implementations. DBI also provides an implementation #' for data.frame which will return a character vector giving the type for each #' column in the dataframe. #' #' The data types supported by databases are different than the data types in R, #' but the mapping between the primitive types is straightforward: #' - Any of the many fixed and varying length character types are mapped to #' character vectors #' - Fixed-precision (non-IEEE) numbers are mapped into either numeric or #' integer vectors. #' #' Notice that many DBMS do not follow IEEE arithmetic, so there are potential #' problems with under/overflows and loss of precision. #' #' @template methods #' @templateVar method_name dbDataType #' #' @inherit DBItest::spec_driver_data_type return #' @inheritSection DBItest::spec_driver_data_type Failure modes #' @inheritSection DBItest::spec_driver_data_type Specification #' @inheritSection DBItest::spec_result_create_table_with_data_type Specification #' #' @inheritParams dbListConnections #' @param dbObj A object inheriting from [DBI::DBIDriver][DBIDriver-class] #' or [DBI::DBIConnection][DBIConnection-class] #' @param obj An R object whose SQL type we want to determine. #' @family DBIDriver generics #' @family DBIConnection generics #' @family DBIConnector generics #' @examples #' dbDataType(ANSI(), 1:5) #' dbDataType(ANSI(), 1) #' dbDataType(ANSI(), TRUE) #' dbDataType(ANSI(), Sys.Date()) #' dbDataType(ANSI(), Sys.time()) #' dbDataType(ANSI(), Sys.time() - as.POSIXct(Sys.Date())) #' dbDataType(ANSI(), c("x", "abc")) #' dbDataType(ANSI(), list(raw(10), raw(20))) #' dbDataType(ANSI(), I(3)) #' #' dbDataType(ANSI(), iris) #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbDataType(con, 1:5) #' dbDataType(con, 1) #' dbDataType(con, TRUE) #' dbDataType(con, Sys.Date()) #' dbDataType(con, Sys.time()) #' dbDataType(con, Sys.time() - as.POSIXct(Sys.Date())) #' dbDataType(con, c("x", "abc")) #' dbDataType(con, list(raw(10), raw(20))) #' dbDataType(con, I(3)) #' #' dbDataType(con, iris) #' #' dbDisconnect(con) #' @export setGeneric( "dbDataType", def = function(dbObj, obj, ...) standardGeneric("dbDataType"), valueClass = "character" ) DBI/R/dbGetRowsAffected_DBIResultArrow.R0000644000176200001440000000042415071142015017402 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetRowsAffected_DBIResultArrow <- function(res, ...) { dbGetRowsAffected(res@result, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbGetRowsAffected", signature("DBIResultArrow"), dbGetRowsAffected_DBIResultArrow ) DBI/R/summary_DBIObject.R0000644000176200001440000000065015071142015014473 0ustar liggesusers#' @usage NULL summary_DBIObject <- function(object, ...) { info <- dbGetInfo(dbObj = object, ...) cat(class(object), "\n") print_list_pairs(info) invisible(info) } setMethod("summary", "DBIObject", summary_DBIObject) print_list_pairs <- function(x, ...) { for (key in names(x)) { value <- format(x[[key]]) if (identical(value, "")) { next } cat(key, "=", value, "\n") } invisible(x) } DBI/R/dbReadTableArrow_DBIConnection.R0000644000176200001440000000054115071142015017032 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbReadTableArrow_DBIConnection <- function(conn, name, ...) { sql_name <- dbReadTable_toSqlName(conn, name, ...) dbGetQueryArrow(conn, paste0("SELECT * FROM ", sql_name)) } #' @rdname hidden_aliases #' @export setMethod( "dbReadTableArrow", signature("DBIConnection"), dbReadTableArrow_DBIConnection ) DBI/R/dbIsValid.R0000644000176200001440000000152415071142015013033 0ustar liggesusers#' Is this DBMS object still valid? #' #' This generic tests whether a database object is still valid (i.e. it hasn't #' been disconnected or cleared). #' #' @template methods #' @templateVar method_name dbIsValid #' #' @inherit DBItest::spec_meta_is_valid return #' #' @inheritParams dbGetInfo #' @family DBIDriver generics #' @family DBIConnection generics #' @family DBIResult generics #' @family DBIResultArrow generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' dbIsValid(RSQLite::SQLite()) #' #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' dbIsValid(con) #' #' rs <- dbSendQuery(con, "SELECT 1") #' dbIsValid(rs) #' #' dbClearResult(rs) #' dbIsValid(rs) #' #' dbDisconnect(con) #' dbIsValid(con) setGeneric( "dbIsValid", def = function(dbObj, ...) standardGeneric("dbIsValid"), valueClass = "logical" ) DBI/R/07-DBIResultArrow.R0000644000176200001440000000146215071142015014227 0ustar liggesusers#' DBIResultArrow class #' #' @description #' `r lifecycle::badge('experimental')` #' #' This virtual class describes the result and state of execution of #' a DBMS statement (any statement, query or non-query) #' for returning data as an Arrow object. #' #' @section Implementation notes: #' Individual drivers are free to allow single or multiple #' active results per connection. #' #' The default show method displays a summary of the query using other #' DBI generics. #' #' @name DBIResultArrow-class #' @docType class #' @family DBI classes #' @family DBIResultArrow generics #' @export setClass("DBIResultArrow", contains = c("DBIObject", "VIRTUAL")) #' @rdname DBIResultArrow-class #' @export setClass( "DBIResultArrowDefault", contains = "DBIResultArrow", slots = list( result = "DBIResult" ) ) DBI/R/sqlCreateTable_DBIConnection.R0000644000176200001440000000174515071142015016570 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL sqlCreateTable_DBIConnection <- function( con, table, fields, row.names = NA, temporary = FALSE, ... ) { if (missing(row.names)) { warning( "Do not rely on the default value of the row.names argument for sqlCreateTable(), it will change in the future.", call. = FALSE ) } table <- dbQuoteIdentifier(con, table) if (is.data.frame(fields)) { fields <- sqlRownamesToColumn(fields, row.names) fields <- vapply(fields, function(x) DBI::dbDataType(con, x), character(1)) } field_names <- dbQuoteIdentifier(con, names(fields)) field_types <- unname(fields) fields <- paste0(field_names, " ", field_types) SQL(paste0( "CREATE ", if (temporary) "TEMPORARY ", "TABLE ", table, " (\n", " ", paste(fields, collapse = ",\n "), "\n)\n" )) } #' @rdname hidden_aliases #' @export setMethod( "sqlCreateTable", signature("DBIConnection"), sqlCreateTable_DBIConnection ) DBI/R/dbCreateTableArrow_DBIConnection.R0000644000176200001440000000110415071142015017356 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbCreateTableArrow_DBIConnection <- function( conn, name, value, ..., temporary = FALSE ) { require_arrow() # https://github.com/apache/arrow-nanoarrow/issues/347 if (!inherits(value, "nanoarrow_schema")) { value <- nanoarrow::infer_nanoarrow_schema(value) } ptype <- nanoarrow::infer_nanoarrow_ptype(value) dbCreateTable(conn, name, ptype, ..., temporary = temporary) } #' @rdname hidden_aliases #' @export setMethod( "dbCreateTableArrow", signature("DBIConnection"), dbCreateTableArrow_DBIConnection ) DBI/R/dbBindArrow_DBIResult.R0000644000176200001440000000065214602466070015256 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbBindArrow_DBIResult <- function(res, params, ...) { dbBind(res, params = param_stream_to_list(params), ...) } #' @rdname hidden_aliases #' @export setMethod("dbBindArrow", signature("DBIResult"), dbBindArrow_DBIResult) param_stream_to_list <- function(params) { params <- as.list(as.data.frame(params)) if (all(names(params) == "")) { names(params) <- NULL } params } DBI/R/dbCreateTable_DBIConnection.R0000644000176200001440000000107615071142015016353 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbCreateTable_DBIConnection <- function( conn, name, fields, ..., row.names = NULL, temporary = FALSE ) { stopifnot(is.null(row.names)) stopifnot(is.logical(temporary), length(temporary) == 1L) query <- sqlCreateTable( con = conn, table = name, fields = fields, row.names = row.names, temporary = temporary, ... ) dbExecute(conn, query) invisible(TRUE) } #' @rdname hidden_aliases #' @export setMethod( "dbCreateTable", signature("DBIConnection"), dbCreateTable_DBIConnection ) DBI/R/dbiDataType_data.frame.R0000644000176200001440000000027214350241735015455 0ustar liggesusersdbiDataType_data.frame <- function(x) { vapply(x, dbiDataType, FUN.VALUE = character(1), USE.NAMES = TRUE) } setMethod("dbiDataType", signature("data.frame"), dbiDataType_data.frame) DBI/R/dbGetInfo.R0000644000176200001440000000127715071142015013040 0ustar liggesusers#' Get DBMS metadata #' #' Retrieves information on objects of class [DBIDriver-class], #' [DBIConnection-class] or [DBIResult-class]. #' #' @param dbObj An object inheriting from [DBIObject-class], #' i.e. [DBIDriver-class], [DBIConnection-class], #' or a [DBIResult-class] #' @param ... Other arguments to methods. #' #' @template methods #' @templateVar method_name dbGetInfo #' #' @family DBIDriver generics #' @family DBIConnection generics #' @family DBIResult generics #' @inherit DBItest::spec_get_info return #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' dbGetInfo(RSQLite::SQLite()) setGeneric("dbGetInfo", def = function(dbObj, ...) standardGeneric("dbGetInfo")) DBI/R/sqlInterpolate.R0000644000176200001440000000607315071142015014204 0ustar liggesusers#' Safely interpolate values into an SQL string #' #' @description #' Accepts a query string with placeholders for values, and returns a string #' with the values embedded. #' The function is careful to quote all of its inputs with [dbQuoteLiteral()] #' to protect against SQL injection attacks. #' #' Placeholders can be specified with one of two syntaxes: #' #' - `?`: each occurrence of a standalone `?` is replaced with a value #' - `?name1`, `?name2`, ...: values are given as named arguments or a #' named list, the names are used to match the values #' #' Mixing `?` and `?name` syntaxes is an error. #' The number and names of values supplied must correspond to the placeholders #' used in the query. #' #' @section Backend authors: #' If you are implementing an SQL backend with non-ANSI quoting rules, you'll #' need to implement a method for [sqlParseVariables()]. Failure to #' do so does not expose you to SQL injection attacks, but will (rarely) result #' in errors matching supplied and interpolated variables. #' #' @inheritParams dbGetQuery #' @param sql A SQL string containing variables to interpolate. #' Variables must start with a question mark and can be any valid R #' identifier, i.e. it must start with a letter or `.`, and be followed #' by a letter, digit, `.` or `_`. #' @param ...,.dots Values (for `...`) or a list (for `.dots`) #' to interpolate into a string. #' Names are required if `sql` uses the `?name` syntax for placeholders. #' All values will be first escaped with [dbQuoteLiteral()] prior #' to interpolation to protect against SQL injection attacks. #' Arguments created by [SQL()] or [dbQuoteIdentifier()] remain unchanged. #' @return The `sql` query with the values from `...` and `.dots` safely #' embedded. #' #' @template methods #' @templateVar method_name sqlInterpolate #' #' @export #' @examples #' sql <- "SELECT * FROM X WHERE name = ?name" #' sqlInterpolate(ANSI(), sql, name = "Hadley") #' #' # This is safe because the single quote has been double escaped #' sqlInterpolate(ANSI(), sql, name = "H'); DROP TABLE--;") #' #' # Using paste0() could lead to dangerous SQL with carefully crafted inputs #' # (SQL injection) #' name <- "H'); DROP TABLE--;" #' paste0("SELECT * FROM X WHERE name = '", name, "'") #' #' # Use SQL() or dbQuoteIdentifier() to avoid escaping #' sql2 <- "SELECT * FROM ?table WHERE name in ?names" #' sqlInterpolate(ANSI(), sql2, #' table = dbQuoteIdentifier(ANSI(), "X"), #' names = SQL("('a', 'b')") #' ) #' #' # Don't use SQL() to escape identifiers to avoid SQL injection #' sqlInterpolate(ANSI(), sql2, #' table = SQL("X; DELETE FROM X; SELECT * FROM X"), #' names = SQL("('a', 'b')") #' ) #' #' # Use dbGetQuery() or dbExecute() to process these queries: #' if (requireNamespace("RSQLite", quietly = TRUE)) { #' con <- dbConnect(RSQLite::SQLite()) #' sql <- "SELECT ?value AS value" #' query <- sqlInterpolate(con, sql, value = 3) #' print(dbGetQuery(con, query)) #' dbDisconnect(con) #' } setGeneric("sqlInterpolate", def = function(conn, sql, ..., .dots = list()) { standardGeneric("sqlInterpolate") }) DBI/R/show_DBIConnection.R0000644000176200001440000000061214350241735014655 0ustar liggesusers#' @rdname hidden_aliases #' @param object Object to display #' @usage NULL show_DBIConnection <- function(object) { # to protect drivers that fail to implement the required methods (e.g., # RPostgreSQL) tryCatch( show_connection(object), error = function(e) NULL ) invisible(NULL) } #' @rdname hidden_aliases #' @export setMethod("show", "DBIConnection", show_DBIConnection) DBI/R/dbClearResult.R0000644000176200001440000000220215071142015013717 0ustar liggesusers#' Clear a result set #' #' Frees all resources (local and remote) associated with a result set. #' This step is mandatory for all objects obtained by calling #' [dbSendQuery()] or [dbSendStatement()]. #' #' @inheritSection dbBind The data retrieval flow #' @inheritSection dbBind The command execution flow #' #' @template methods #' @templateVar method_name dbClearResult #' #' @inherit DBItest::spec_result_clear_result return #' @inheritSection DBItest::spec_result_clear_result Failure modes #' @inheritSection DBItest::spec_result_clear_result Specification #' #' @param res An object inheriting from [DBI::DBIResult][DBIResult-class]. #' @param ... Other arguments passed on to methods. #' @family DBIResult generics #' @family DBIResultArrow generics #' @family data retrieval generics #' @family command execution generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' rs <- dbSendQuery(con, "SELECT 1") #' print(dbFetch(rs)) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric("dbClearResult", def = function(res, ...) { standardGeneric("dbClearResult") }) DBI/R/sqlInterpolate_DBIConnection.R0000644000176200001440000000255715071142015016705 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL sqlInterpolate_DBIConnection <- function(conn, sql, ..., .dots = list()) { pos <- sqlParseVariables(conn, sql) if (length(pos$start) == 0) { return(SQL(sql)) } vars <- substring(sql, pos$start + 1, pos$end) positional_vars <- pos$start == pos$end if (all(positional_vars) != any(positional_vars)) { stop("Can't mix positional (?) and named (?asdf) variables", call. = FALSE) } values <- c(list(...), .dots) if (all(positional_vars)) { if (length(vars) != length(values)) { stop( "Supplied values don't match positional vars to interpolate", call. = FALSE ) } if (any(names(values) != "")) { stop("Positional variables don't take named arguments") } } else { if (!setequal(vars, names(values))) { stop( "Supplied values don't match named vars to interpolate", call. = FALSE ) } values <- values[vars] } safe_values <- vapply( values, function(x) dbQuoteLiteral(conn, x), character(1) ) for (i in rev(seq_along(vars))) { sql <- paste0( substring(sql, 0, pos$start[i] - 1), safe_values[i], substring(sql, pos$end[i] + 1, nchar(sql)) ) } SQL(sql) } #' @rdname hidden_aliases #' @export setMethod( "sqlInterpolate", signature("DBIConnection"), sqlInterpolate_DBIConnection ) DBI/R/dbDriver.R0000644000176200001440000000332715071142015012736 0ustar liggesusers#' Load and unload database drivers #' #' @description #' These methods are deprecated, please consult the documentation of the #' individual backends for the construction of driver instances. #' #' `dbDriver()` is a helper method used to create an new driver object #' given the name of a database or the corresponding R package. It works #' through convention: all DBI-extending packages should provide an exported #' object with the same name as the package. `dbDriver()` just looks for #' this object in the right places: if you know what database you are connecting #' to, you should call the function directly. #' #' @details #' The client part of the database communication is #' initialized (typically dynamically loading C code, etc.) but note that #' connecting to the database engine itself needs to be done through calls to #' `dbConnect`. #' #' @param drvName character name of the driver to instantiate. #' @param drv an object that inherits from `DBIDriver` as created by #' `dbDriver`. #' @param ... any other arguments are passed to the driver `drvName`. #' @return In the case of `dbDriver`, an driver object whose class extends #' `DBIDriver`. This object may be used to create connections to the #' actual DBMS engine. #' #' In the case of `dbUnloadDriver`, a logical indicating whether the #' operation succeeded or not. #' @import methods #' @family DBIDriver generics #' @export #' @keywords internal #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' # Create a RSQLite driver with a string #' d <- dbDriver("SQLite") #' d #' #' # But better, access the object directly #' RSQLite::SQLite() setGeneric( "dbDriver", def = function(drvName, ...) standardGeneric("dbDriver"), valueClass = "DBIDriver" ) DBI/R/dbSendStatement.R0000644000176200001440000000460115071142015014255 0ustar liggesusers#' Execute a data manipulation statement on a given database connection #' #' The `dbSendStatement()` method only submits and synchronously executes the #' SQL data manipulation statement (e.g., `UPDATE`, `DELETE`, #' `INSERT INTO`, `DROP TABLE`, ...) to the database engine. To query #' the number of affected rows, call [dbGetRowsAffected()] on the #' returned result object. You must also call [dbClearResult()] after #' that. For interactive use, you should almost always prefer #' [dbExecute()]. #' #' [dbSendStatement()] comes with a default implementation that simply #' forwards to [dbSendQuery()], to support backends that only #' implement the latter. #' #' @inheritSection dbBind The command execution flow #' #' @template methods #' @templateVar method_name dbSendStatement #' #' @inherit DBItest::spec_result_send_statement return #' @inheritSection DBItest::spec_result_send_statement Failure modes #' @inheritSection DBItest::spec_result_send_statement Additional arguments #' @inheritSection DBItest::spec_result_send_statement Specification #' @inheritSection DBItest::spec_result_send_statement Specification for the `immediate` argument #' #' @inheritParams dbGetQuery #' @param statement a character string containing SQL. #' #' @family DBIConnection generics #' @family command execution generics #' #' @seealso For queries: [dbSendQuery()] and [dbGetQuery()]. #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "cars", head(cars, 3)) #' #' rs <- dbSendStatement( #' con, #' "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" #' ) #' dbHasCompleted(rs) #' dbGetRowsAffected(rs) #' dbClearResult(rs) #' dbReadTable(con, "cars") # there are now 6 rows #' #' # Pass one set of values directly using the param argument: #' rs <- dbSendStatement( #' con, #' "INSERT INTO cars (speed, dist) VALUES (?, ?)", #' params = list(4L, 5L) #' ) #' dbClearResult(rs) #' #' # Pass multiple sets of values using dbBind(): #' rs <- dbSendStatement( #' con, #' "INSERT INTO cars (speed, dist) VALUES (?, ?)" #' ) #' dbBind(rs, list(5:6, 6:7)) #' dbBind(rs, list(7L, 8L)) #' dbClearResult(rs) #' dbReadTable(con, "cars") # there are now 10 rows #' #' dbDisconnect(con) #' @export setGeneric( "dbSendStatement", def = function(conn, statement, ...) standardGeneric("dbSendStatement"), valueClass = "DBIResult" ) DBI/R/methods_as_rd.R0000644000176200001440000000422215071142015014003 0ustar liggesusersmethods_as_rd <- function(method) { if (method == "transactions") { method <- c("dbBegin", "dbCommit", "dbRollback") } if ( identical(Sys.getenv("IN_PKGDOWN"), "true") && file.exists("DESCRIPTION") ) { packages <- strsplit( read.dcf("DESCRIPTION")[, "Config/Needs/website"], ",( |\n)*", perl = TRUE )[[1]] packages <- grep("/", packages, invert = TRUE, value = TRUE) for (package in packages) { stopifnot(requireNamespace(package, quietly = TRUE)) } } methods <- unlist(lapply(method, methods::findMethods), recursive = FALSE) # Extracted from roxygen2::object_topic.s4method s4_topic <- function(x) { sig <- paste0(x@defined, collapse = ",") sig_text <- paste0('"', x@defined, '"', collapse = ", ") package <- unname(tryCatch( getNamespaceName(environment(x@.Data)), error = function(e) NA )) if (is.na(package) || package == "DBI") { return(data.frame()) } topic <- paste0(x@generic, ",", sig, "-method") call <- paste0(package, "::", x@generic, "(", sig_text, ")") if (identical(Sys.getenv("IN_PKGDOWN"), "true")) { url <- downlit::autolink_url(paste0("?", package, "::`", topic, "`")) } else { url <- NA } data.frame(package, topic, call, url, stringsAsFactors = FALSE) } item_list <- lapply(methods@.Data, s4_topic) items <- do.call(rbind, item_list) if (is.null(items) || ncol(items) == 0) { return("") } items <- items[order(items$call), ] if (identical(Sys.getenv("IN_PKGDOWN"), "true")) { linked <- ifelse( is.na(items$url), items$call, paste0("\\href{", items$url, "}{", items$call, "}") ) item_text <- paste0("\\code{", linked, "}") } else { item_text <- paste0("\\code{\\link[=", items$topic, "]{", items$call, "}}") } paste0( "\\subsection{Methods in other packages}{\n\n", "This documentation page describes the generics. ", "Refer to the documentation pages linked below for the documentation for the methods that are implemented in various backend packages.", "\\itemize{\n", paste0("\\item ", item_text, "\n", collapse = ""), "}}\n" ) } DBI/R/22-dbCreateTableArrow.R0000644000176200001440000000337215144400570015116 0ustar liggesusers#' Create a table in the database based on an Arrow object #' #' @description #' `r lifecycle::badge('experimental')` #' #' The default `dbCreateTableArrow()` method determines the R data types #' of the Arrow schema associated with the Arrow object, #' and calls [dbCreateTable()]. #' Backends that implement [dbAppendTableArrow()] should typically #' also implement this generic. #' Use [dbCreateTable()] to create a table from the column types #' as defined in a data frame. #' #' @param value An object for which a schema can be determined via #' [nanoarrow::infer_nanoarrow_schema()]. #' @inheritParams dbReadTable #' @inheritParams sqlCreateTable #' #' @inherit DBItest::spec_arrow_create_table_arrow return #' @inheritSection DBItest::spec_arrow_create_table_arrow Failure modes #' @inheritSection DBItest::spec_arrow_create_table_arrow Additional arguments #' @inheritSection DBItest::spec_arrow_create_table_arrow Specification #' #' @template methods #' @templateVar method_name dbCreateTableArrow #' #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' ptype <- data.frame(a = numeric()) #' dbCreateTableArrow(con, "df", nanoarrow::infer_nanoarrow_schema(ptype)) #' dbReadTable(con, "df") #' dbDisconnect(con) setGeneric( "dbCreateTableArrow", def = function(conn, name, value, ..., temporary = FALSE) { otel_local_active_span( "CREATE TABLE", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn), db.operation.name = "CREATE TABLE" ) ) standardGeneric("dbCreateTableArrow") } ) DBI/R/11-dbAppendTable.R0000644000176200001440000000365315144400570014107 0ustar liggesusers#' Insert rows into a table #' #' The `dbAppendTable()` method assumes that the table has been created #' beforehand, e.g. with [dbCreateTable()]. #' The default implementation calls [sqlAppendTableTemplate()] and then #' [dbExecute()] with the `param` argument. #' Use [dbAppendTableArrow()] to append data from an Arrow stream. #' #' Backends compliant to #' ANSI SQL 99 which use `?` as a placeholder for prepared queries don't need #' to override it. Backends with a different SQL syntax which use `?` #' as a placeholder for prepared queries can override [sqlAppendTable()]. #' Other backends (with different placeholders or with entirely different #' ways to create tables) need to override the `dbAppendTable()` method. #' #' The `row.names` argument is not supported by this method. #' Process the values with [sqlRownamesToColumn()] before calling this method. #' #' @inheritParams dbReadTable #' @param value A [data.frame] (or coercible to data.frame). #' @param row.names Must be `NULL`. #' @inheritParams sqlAppendTableTemplate #' #' @template methods #' @templateVar method_name dbAppendTable #' #' @inherit DBItest::spec_sql_append_table return #' @inheritSection DBItest::spec_sql_append_table Failure modes #' @inheritSection DBItest::spec_sql_append_table Specification #' #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' dbCreateTable(con, "iris", iris) #' dbAppendTable(con, "iris", iris) #' dbReadTable(con, "iris") #' dbDisconnect(con) setGeneric( "dbAppendTable", def = function(conn, name, value, ..., row.names = NULL) { otel_local_active_span( "INSERT INTO", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn), db.operation.name = "INSERT INTO" ) ) standardGeneric("dbAppendTable") } ) DBI/R/dbReadTable.R0000644000176200001440000000333215144403222013323 0ustar liggesusers#' Read database tables as data frames #' #' Reads a database table to a data frame, optionally converting #' a column to row names and converting the column names to valid #' R identifiers. #' Use [dbReadTableArrow()] instead to obtain an Arrow object. #' #' @details #' This function returns a data frame. #' Use [dbReadTableArrow()] to obtain an Arrow object. #' #' @template methods #' @templateVar method_name dbReadTable #' #' @inherit DBItest::spec_sql_read_table return #' @inheritSection DBItest::spec_sql_read_table Failure modes #' @inheritSection DBItest::spec_sql_read_table Additional arguments #' @inheritSection DBItest::spec_sql_read_table Specification #' #' @inheritParams dbGetQuery #' @param name The table name, passed on to [dbQuoteIdentifier()]. Options are: #' - a character string with the unquoted DBMS table name, #' e.g. `"table_name"`, #' - a call to [Id()] with components to the fully qualified table name, #' e.g. `Id(schema = "my_schema", table = "table_name")` #' - a call to [SQL()] with the quoted and fully qualified table name #' given verbatim, e.g. `SQL('"my_schema"."table_name"')` #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars[1:10, ]) #' dbReadTable(con, "mtcars") #' #' dbDisconnect(con) setGeneric( "dbReadTable", def = function(conn, name, ...) { otel_local_active_span( "dbReadTable", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn) ) ) standardGeneric("dbReadTable") }, valueClass = "data.frame" ) DBI/R/24-dbSendQueryArrow.R0000644000176200001440000000422115071142015014652 0ustar liggesusers#' Execute a query on a given database connection for retrieval via Arrow #' #' @description #' `r lifecycle::badge('experimental')` #' #' The `dbSendQueryArrow()` method only submits and synchronously executes the #' SQL query to the database engine. #' It does \emph{not} extract any #' records --- for that you need to use the [dbFetchArrow()] method, and #' then you must call [dbClearResult()] when you finish fetching the #' records you need. #' For interactive use, you should almost always prefer [dbGetQueryArrow()]. #' Use [dbSendQuery()] or [dbGetQuery()] instead to retrieve the results #' as a data frame. #' #' @details #' This method is for `SELECT` queries only. Some backends may #' support data manipulation queries through this method for compatibility #' reasons. However, callers are strongly encouraged to use #' [dbSendStatement()] for data manipulation statements. #' #' @inheritSection dbBindArrow The data retrieval flow for Arrow streams #' #' @template methods #' @templateVar method_name dbSendQueryArrow #' #' @inherit DBItest::spec_arrow_send_query_arrow return #' @inheritSection DBItest::spec_arrow_send_query_arrow Failure modes #' @inheritSection DBItest::spec_arrow_send_query_arrow Additional arguments #' @inheritSection DBItest::spec_arrow_send_query_arrow Specification #' @inheritSection DBItest::spec_arrow_send_query_arrow Specification for the `immediate` argument #' #' @inheritParams dbGetQueryArrow #' @param statement a character string containing SQL. #' #' @family DBIConnection generics #' @family data retrieval generics #' @seealso For updates: [dbSendStatement()] and [dbExecute()]. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' # Retrieve data as arrow table #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") #' dbFetchArrow(rs) #' dbClearResult(rs) #' #' dbDisconnect(con) setGeneric( "dbSendQueryArrow", def = function(conn, statement, ...) { require_arrow() standardGeneric("dbSendQueryArrow") }, valueClass = "DBIResultArrow" ) DBI/R/04-DBIResult.R0000644000176200001440000000270714602466070013225 0ustar liggesusersNULL #' DBIResult class #' #' This virtual class describes the result and state of execution of #' a DBMS statement (any statement, query or non-query). The result set #' keeps track of whether the statement produces output how many rows were #' affected by the operation, how many rows have been fetched (if statement is #' a query), whether there are more rows to fetch, etc. #' #' @section Implementation notes: #' Individual drivers are free to allow single or multiple #' active results per connection. #' #' The default show method displays a summary of the query using other #' DBI generics. #' #' @name DBIResult-class #' @docType class #' @family DBI classes #' @family DBIResult generics #' @export setClass("DBIResult", contains = c("DBIObject", "VIRTUAL")) show_result <- function(object) { cat("<", is(object)[1], ">\n", sep = "") if (!dbIsValid(object)) { cat("EXPIRED\n") } else { cat(" SQL ", dbGetStatement(object), "\n", sep = "") done <- if (dbHasCompleted(object)) "complete" else "incomplete" cat(" ROWS Fetched: ", dbGetRowCount(object), " [", done, "]\n", sep = "") cat(" Changed: ", dbGetRowsAffected(object), "\n", sep = "") } } #' @name dbGetInfo #' @section Implementation notes: #' The default implementation for `DBIResult objects` #' constructs such a list from the return values of the corresponding methods, #' [dbGetStatement()], [dbGetRowCount()], #' [dbGetRowsAffected()], and [dbHasCompleted()]. NULL DBI/R/otel.R0000644000176200001440000000576215144400571012152 0ustar liggesusersotel_tracer_name <- "org.r-dbi.DBI" # Generic otel helpers: otel_cache_tracer <- NULL otel_local_active_span <- NULL otel_query_local_active_span <- NULL local({ otel_tracer <- NULL otel_is_tracing <- FALSE otel_cache_tracer <<- function() { requireNamespace("otel", quietly = TRUE) || return() otel_tracer <<- otel::get_tracer(otel_tracer_name) otel_is_tracing <<- tracer_enabled(otel_tracer) } otel_local_active_span <<- function( name, conn, label = NULL, attributes = NULL, activation_scope = parent.frame() ) { otel_is_tracing || return() dbname <- .dbi_get_db_name(conn) otel::start_local_active_span( name = sprintf("%s %s", name, if (length(label)) label else dbname), attributes = c(attributes, list(db.system.name = dbname)), options = list(kind = "client"), tracer = otel_tracer, activation_scope = activation_scope ) } otel_query_local_active_span <<- function( conn, statement, activation_scope = parent.frame() ) { otel_is_tracing || return() dbname <- .dbi_get_db_name(conn) collection <- character() op_name <- "SQL" if (length(statement) == 1) { op_name_matcher <- "^\\s*(\\w+)" op_name_matches <- regexec( op_name_matcher, statement, ignore.case = TRUE ) op_name_match <- regmatches(statement, op_name_matches)[[1L]] op_name <- toupper(op_name_match[2L]) collection_matcher <- "(FROM)\\s+([`\"']?)(\\w+)\\2" # collection_matcher <- "(FROM|INTO|UPDATE|TABLE)\\s+([`\"']?)(\\w+)\\2" collection_matches <- gregexec( collection_matcher, statement, ignore.case = TRUE, perl = TRUE ) collection_match <- regmatches(statement, collection_matches)[[1L]] # Returns an empty character vector if there is no match if (is.matrix(collection_match) && nrow(collection_match) >= 4L) { collection <- collection_match[4L, , drop = TRUE] } } otel::start_local_active_span( name = paste(op_name, if (length(collection)) collection else dbname), attributes = list( db.operation.name = op_name, db.collection.name = collection, db.system.name = dbname ), options = list(kind = "client"), tracer = otel_tracer, activation_scope = activation_scope ) } }) tracer_enabled <- function(tracer) { .subset2(tracer, "is_enabled")() } with_otel_record <- function(expr) { on.exit(otel_cache_tracer()) otelsdk::with_otel_record({ otel_cache_tracer() expr }) } # DBI-specific helpers: # When this was called `get_dbname()`, it collided with `dittodb::get_dbname()` # for some weakly understood reason. # The weird name makes collisions more unlikely. .dbi_get_db_name <- function(obj) { dbname <- attr(class(obj), "package") if (is.null(dbname)) "unknown" else dbname } .dbi_get_collection_name <- function(name, conn) { if (is.character(name)) name else dbQuoteIdentifier(conn, x = name) } DBI/R/transactions.R0000644000176200001440000000370014602466070013711 0ustar liggesusers#' Begin/commit/rollback SQL transactions #' #' A transaction encapsulates several SQL statements in an atomic unit. #' It is initiated with `dbBegin()` and either made persistent with `dbCommit()` #' or undone with `dbRollback()`. #' In any case, the DBMS guarantees that either all or none of the statements #' have a permanent effect. #' This helps ensuring consistency of write operations to multiple tables. #' #' Not all database engines implement transaction management, in which case #' these methods should not be implemented for the specific #' [DBIConnection-class] subclass. #' #' @template methods #' @templateVar method_name transactions #' #' @inherit DBItest::spec_transaction_begin_commit_rollback return #' @inheritSection DBItest::spec_transaction_begin_commit_rollback Failure modes #' @inheritSection DBItest::spec_transaction_begin_commit_rollback Specification #' #' @inheritParams dbGetQuery #' @seealso Self-contained transactions: [dbWithTransaction()] #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "cash", data.frame(amount = 100)) #' dbWriteTable(con, "account", data.frame(amount = 2000)) #' #' # All operations are carried out as logical unit: #' dbBegin(con) #' withdrawal <- 300 #' dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) #' dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) #' dbCommit(con) #' #' dbReadTable(con, "cash") #' dbReadTable(con, "account") #' #' # Rolling back after detecting negative value on account: #' dbBegin(con) #' withdrawal <- 5000 #' dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) #' dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) #' if (dbReadTable(con, "account")$amount >= 0) { #' dbCommit(con) #' } else { #' dbRollback(con) #' } #' #' dbReadTable(con, "cash") #' dbReadTable(con, "account") #' #' dbDisconnect(con) NULL DBI/R/sqlAppendTable.R0000644000176200001440000000215215071142015014067 0ustar liggesusers#' Compose query to insert rows into a table #' #' `sqlAppendTable()` generates a single SQL string that inserts a #' data frame into an existing table. `sqlAppendTableTemplate()` generates #' a template suitable for use with [dbBind()]. #' The default methods are ANSI SQL 99 compliant. #' These methods are mostly useful for backend implementers. #' #' The `row.names` argument must be passed explicitly in order to avoid #' a compatibility warning. The default will be changed in a later release. #' #' @inheritParams sqlCreateTable #' @inheritParams rownames #' @param values A data frame. Factors will be converted to character vectors. #' Character vectors will be escaped with [dbQuoteString()]. #' #' @template methods #' @templateVar method_name sqlAppendTable #' #' @family SQL generation #' @export #' @examples #' sqlAppendTable(ANSI(), "iris", head(iris)) #' #' sqlAppendTable(ANSI(), "mtcars", head(mtcars)) #' sqlAppendTable(ANSI(), "mtcars", head(mtcars), row.names = FALSE) setGeneric( "sqlAppendTable", def = function(con, table, values, row.names = NA, ...) { standardGeneric("sqlAppendTable") } ) DBI/R/dbUnquoteIdentifier_DBIConnection.R0000644000176200001440000000171015071142015017636 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbUnquoteIdentifier_DBIConnection <- function(conn, x, ...) { if (is(x, "SQL") || is.character(x)) { if (is.character(x)) { stopifnot(!anyNA(x)) } # Determine quoting character quote_char <- substr(dbQuoteIdentifier(conn, ""), 1L, 1L) x <- lapply(x, unquote, quote_char = quote_char) lapply(x, Id) } else if (is(x, "Id")) { list(x) } else { stop("x must be SQL, Id, or character", call. = FALSE) } } unquote <- function(x, quote_char) { # replace doubled quotes with escaped quote gsub <- gsub( pattern = paste0(quote_char, quote_char), replacement = paste0("\\", quote_char), x ) scan( text = x, what = character(), quote = quote_char, quiet = TRUE, na.strings = character(), sep = "." ) } #' @rdname hidden_aliases #' @export setMethod( "dbUnquoteIdentifier", signature("DBIConnection"), dbUnquoteIdentifier_DBIConnection ) DBI/R/dbExistsTable.R0000644000176200001440000000140115071142015013721 0ustar liggesusers#' Does a table exist? #' #' Returns if a table given by name exists in the database. #' #' @template methods #' @templateVar method_name dbExistsTable #' #' @inherit DBItest::spec_sql_exists_table return #' @inheritSection DBItest::spec_sql_exists_table Failure modes #' @inheritSection DBItest::spec_sql_exists_table Specification #' #' @inheritParams dbReadTable #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbExistsTable(con, "iris") #' dbWriteTable(con, "iris", iris) #' dbExistsTable(con, "iris") #' #' dbDisconnect(con) setGeneric( "dbExistsTable", def = function(conn, name, ...) standardGeneric("dbExistsTable"), valueClass = "logical" ) DBI/R/dbWriteTable_DBIConnection_Id_ANY.R0000644000176200001440000000050615071142015017362 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbWriteTable_DBIConnection_Id_ANY <- function(conn, name, value, ...) { dbWriteTable(conn, dbQuoteIdentifier(conn, name), value, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbWriteTable", signature("DBIConnection", "Id", "ANY"), dbWriteTable_DBIConnection_Id_ANY ) DBI/R/dbGetQueryArrow.R0000644000176200001440000000460515143005033014261 0ustar liggesusers#' Retrieve results from a query as an Arrow object #' #' @description #' `r lifecycle::badge('experimental')` #' #' Returns the result of a query as an Arrow object. #' `dbGetQueryArrow()` comes with a default implementation #' (which should work with most backends) that calls #' [dbSendQueryArrow()], then [dbFetchArrow()], ensuring that #' the result is always freed by [dbClearResult()]. #' For passing query parameters, #' see [dbSendQueryArrow()], in particular #' the "The data retrieval flow for Arrow streams" section. #' For retrieving results as a data frame, see [dbGetQuery()]. #' #' @details #' This method is for `SELECT` queries only #' (incl. other SQL statements that return a `SELECT`-alike result, #' e.g., execution of a stored procedure or data manipulation queries #' like `INSERT INTO ... RETURNING ...`). #' To execute a stored procedure that does not return a result set, #' use [dbExecute()]. #' #' Some backends may #' support data manipulation statements through this method. #' However, callers are strongly advised to use #' [dbExecute()] for data manipulation statements. #' #' @template methods #' @templateVar method_name dbGetQueryArrow #' #' @inherit DBItest::spec_arrow_get_query_arrow return #' @inheritSection DBItest::spec_arrow_get_query_arrow Failure modes #' @inheritSection DBItest::spec_arrow_get_query_arrow Additional arguments #' @inheritSection DBItest::spec_arrow_get_query_arrow Specification for the `immediate` argument #' #' @section Implementation notes: #' Subclasses should override this method only if they provide some sort of #' performance optimization. #' #' @param conn A [DBI::DBIConnection][DBIConnection-class] object, #' as returned by [dbConnect()]. #' @param statement a character string containing SQL. #' @param ... Other parameters passed on to methods. #' @family DBIConnection generics #' @family data retrieval generics #' @seealso For updates: [dbSendStatement()] and [dbExecute()]. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' # Retrieve data as arrow table #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' dbGetQueryArrow(con, "SELECT * FROM mtcars") #' #' dbDisconnect(con) setGeneric("dbGetQueryArrow", def = function(conn, statement, ...) { otel_query_local_active_span(conn, statement) standardGeneric("dbGetQueryArrow") }) DBI/R/dbExistsTable_DBIConnection_Id.R0000644000176200001440000000045515071142015017043 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbExistsTable_DBIConnection_Id <- function(conn, name, ...) { dbExistsTable(conn, dbQuoteIdentifier(conn, name), ...) } #' @rdname hidden_aliases #' @export setMethod( "dbExistsTable", signature("DBIConnection", "Id"), dbExistsTable_DBIConnection_Id ) DBI/R/isSQLKeyword.R0000644000176200001440000000044615071142015013534 0ustar liggesusers#' @rdname make.db.names #' @export setGeneric( "isSQLKeyword", def = function( dbObj, name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3], ... ) { standardGeneric("isSQLKeyword") }, signature = c("dbObj", "name"), valueClass = "logical" ) DBI/R/dbCommit.R0000644000176200001440000000016115071142015012724 0ustar liggesusers#' @export #' @rdname transactions setGeneric("dbCommit", def = function(conn, ...) standardGeneric("dbCommit")) DBI/R/23-dbWriteTableArrow.R0000644000176200001440000000350215144400570015001 0ustar liggesusers#' Copy Arrow objects to database tables #' #' @description #' `r lifecycle::badge('experimental')` #' #' Writes, overwrites or appends an Arrow object to a database table. #' #' @details #' This function expects an Arrow object. #' Convert a data frame to an Arrow object with [nanoarrow::as_nanoarrow_array_stream()] or #' use [dbWriteTable()] to write a data frame. #' #' This function is useful if you want to create and load a table at the same time. #' Use [dbAppendTableArrow()] for appending data to an existing #' table, [dbCreateTableArrow()] for creating a table and specifying field types, #' and [dbRemoveTable()] for overwriting tables. #' #' @template methods #' @templateVar method_name dbWriteTableArrow #' #' @inherit DBItest::spec_arrow_write_table_arrow return #' @inheritSection DBItest::spec_arrow_write_table_arrow Failure modes #' @inheritSection DBItest::spec_arrow_write_table_arrow Additional arguments #' @inheritSection DBItest::spec_arrow_write_table_arrow Specification #' #' @inheritParams dbGetQuery #' @inheritParams dbReadTable #' @param value An nanoarray stream, or an object coercible to a nanoarray stream with #' [nanoarrow::as_nanoarrow_array_stream()]. #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTableArrow(con, "mtcars", nanoarrow::as_nanoarrow_array_stream(mtcars[1:5, ])) #' dbReadTable(con, "mtcars") #' #' dbDisconnect(con) setGeneric("dbWriteTableArrow", def = function(conn, name, value, ...) { otel_local_active_span( "dbWriteTableArrow", conn, label = .dbi_get_collection_name(name, conn), attributes = list(db.collection.name = .dbi_get_collection_name(name, conn)) ) standardGeneric("dbWriteTableArrow") }) DBI/R/dbListResults.R0000644000176200001440000000101115071142015013764 0ustar liggesusers#' A list of all pending results #' #' DEPRECATED. DBI currenty supports only one open result set per connection, #' you need to keep track of the result sets you open if you need this #' functionality. #' #' @inheritParams dbGetQuery #' @family DBIConnection generics #' @return a list. If no results are active, an empty list. If only #' a single result is active, a list with one element. #' @export #' @keywords internal setGeneric("dbListResults", def = function(conn, ...) { standardGeneric("dbListResults") }) DBI/R/dbWithTransaction_DBIConnection.R0000644000176200001440000000255515071142015017324 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbWithTransaction_DBIConnection <- function(conn, code) { ## needs to be a closure, because it accesses conn rollback_because <- function(e) { call <- dbRollback(conn) if (identical(call, FALSE)) { stop( paste( "Failed to rollback transaction.", "Tried to roll back because an error", "occurred:", conditionMessage(e) ), call. = FALSE ) } if (inherits(e, "error")) { stop(e) } } ## check if each operation is successful call <- dbBegin(conn) if (identical(call, FALSE)) { stop("Failed to begin transaction", call. = FALSE) } tryCatch( { res <- force(code) call <- dbCommit(conn) if (identical(call, FALSE)) { stop("Failed to commit transaction", call. = FALSE) } res }, dbi_abort = rollback_because, error = rollback_because, interrupt = rollback_because ) } #' @rdname hidden_aliases #' @export setMethod( "dbWithTransaction", signature("DBIConnection"), dbWithTransaction_DBIConnection ) #' @export #' @rdname dbWithTransaction dbBreak <- function() { signalCondition( structure( list(message = "Aborting DBI processing", call = NULL), class = c("dbi_abort", "condition") ) ) stop("Invalid usage of dbBreak().", call. = FALSE) } DBI/R/dbWriteTableArrow_DBIConnection.R0000644000176200001440000000210515071142015017247 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbWriteTableArrow_DBIConnection <- function( conn, name, value, append = FALSE, overwrite = FALSE, ..., temporary = FALSE ) { require_arrow() stopifnot(is.logical(append)) stopifnot(length(append) == 1) stopifnot(!is.na(append)) stopifnot(is.logical(overwrite)) stopifnot(length(overwrite) == 1) stopifnot(!is.na(overwrite)) stopifnot(is.logical(temporary)) stopifnot(length(temporary) == 1) stopifnot(!is.na(temporary)) name <- dbQuoteIdentifier(conn, name) value <- nanoarrow::as_nanoarrow_array_stream(value) if (overwrite && append) { stop("overwrite and append cannot both be TRUE") } exists <- dbExistsTable(conn, name) if (overwrite && exists) { dbRemoveTable(conn, name) } if (overwrite || !append || !exists) { dbCreateTableArrow(conn, name, value, temporary = temporary) } dbAppendTableArrow(conn, name, value) invisible(TRUE) } #' @rdname hidden_aliases #' @export setMethod( "dbWriteTableArrow", signature("DBIConnection"), dbWriteTableArrow_DBIConnection ) DBI/R/dbHasCompleted_DBIResultArrow.R0000644000176200001440000000041015071142015016731 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbHasCompleted_DBIResultArrow <- function(res, ...) { dbHasCompleted(res@result, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbHasCompleted", signature("DBIResultArrow"), dbHasCompleted_DBIResultArrow ) DBI/R/dbGetQueryArrow_DBIConnection.R0000644000176200001440000000055315071142015016757 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetQueryArrow_DBIConnection_character <- function(conn, statement, ...) { rs <- dbSendQueryArrow(conn, statement, ...) on.exit(dbClearResult(rs)) dbFetchArrow(rs, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbGetQueryArrow", signature("DBIConnection"), dbGetQueryArrow_DBIConnection_character ) DBI/R/dbDataType_DBIConnector.R0000644000176200001440000000036614350241735015557 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbDataType_DBIConnector <- function(dbObj, obj, ...) { dbDataType(dbObj@.drv, obj, ...) } #' @rdname hidden_aliases #' @export setMethod("dbDataType", signature("DBIConnector"), dbDataType_DBIConnector) DBI/R/dbiDataType_POSIXct.R0000644000176200001440000000020314350241735014676 0ustar liggesusers#' @usage NULL dbiDataType_POSIXct <- function(x) "TIMESTAMP" setMethod("dbiDataType", signature("POSIXct"), dbiDataType_POSIXct) DBI/R/dbQuoteLiteral_DBIConnection.R0000644000176200001440000000251315071142015016607 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbQuoteLiteral_DBIConnection <- function(conn, x, ...) { # Switchpatching to avoid ambiguous S4 dispatch, so that our method # is used only if no alternatives are available. if (is(x, "SQL")) { return(x) } if (is.factor(x)) { return(dbQuoteString(conn, as.character(x))) } if (is.character(x)) { return(dbQuoteString(conn, x)) } if (inherits(x, "POSIXt")) { return(dbQuoteString( conn, strftime(as.POSIXct(x), "%Y-%m-%d %H:%M:%S%z") )) } if (inherits(x, "Date")) { return(dbQuoteString(conn, as.character(x))) } if (inherits(x, "difftime")) { return(dbQuoteString(conn, format_hms(x))) } if (is.list(x)) { blob_data <- vapply( x, function(x) { if (is.null(x)) { "NULL" } else if (is.raw(x)) { paste0("X'", paste(format(x), collapse = ""), "'") } else { stop("Lists must contain raw vectors or NULL", call. = FALSE) } }, character(1) ) return(SQL(blob_data, names = names(x))) } if (is.logical(x)) { x <- as.numeric(x) } x <- as.character(x) x[is.na(x)] <- "NULL" SQL(x, names = names(x)) } #' @rdname hidden_aliases #' @export setMethod( "dbQuoteLiteral", signature("DBIConnection"), dbQuoteLiteral_DBIConnection ) DBI/R/dbAppendTableArrow_DBIConnection.R0000644000176200001440000000331115071142015017364 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbAppendTableArrow_DBIConnection <- function(conn, name, value, ...) { require_arrow() name <- dbQuoteIdentifier(conn, name) value <- nanoarrow::as_nanoarrow_array_stream(value) rows <- 0L while (TRUE) { # Append next batch (starting with the first or second, doesn't matter) tmp <- value$get_next() if (is.null(tmp)) { break } tmp_df <- as.data.frame(tmp) dbAppendTable(conn, name, stream_append_data(tmp_df), ...) rows <- rows + nrow(tmp_df) } value$release() rows } #' @rdname hidden_aliases #' @export setMethod( "dbAppendTableArrow", signature("DBIConnection"), dbAppendTableArrow_DBIConnection ) stream_append_data <- function(value) { value <- factor_to_string(value) value <- string_to_utf8(value) value } factor_to_string <- function(value, warn = FALSE) { is_factor <- vapply(value, is.factor, logical(1)) if (warn && any(is_factor)) { warning("Factors converted to character", call. = FALSE) } value[is_factor] <- lapply(value[is_factor], as.character) value } raw_to_string <- function(value) { is_raw <- vapply(value, is.raw, logical(1)) if (any(is_raw)) { warning( "Creating a TEXT column from raw, use lists of raw to create BLOB columns", call. = FALSE ) value[is_raw] <- lapply(value[is_raw], as.character) } value } quote_string <- function(value, conn) { is_character <- vapply(value, is.character, logical(1)) value[is_character] <- lapply(value[is_character], dbQuoteString, conn = conn) value } string_to_utf8 <- function(value) { is_char <- vapply(value, is.character, logical(1)) value[is_char] <- lapply(value[is_char], enc2utf8) value } DBI/R/dbGetRowCount.R0000644000176200001440000000162315071142015013720 0ustar liggesusers#' The number of rows fetched so far #' #' Returns the total number of rows actually fetched with calls to [dbFetch()] #' for this result set. #' #' @template methods #' @templateVar method_name dbGetRowCount #' #' @inherit DBItest::spec_meta_get_row_count return #' @inheritSection DBItest::spec_meta_get_row_count Failure modes #' #' @inheritParams dbClearResult #' @family DBIResult generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendQuery(con, "SELECT * FROM mtcars") #' #' dbGetRowCount(rs) #' ret1 <- dbFetch(rs, 10) #' dbGetRowCount(rs) #' ret2 <- dbFetch(rs) #' dbGetRowCount(rs) #' nrow(ret1) + nrow(ret2) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbGetRowCount", def = function(res, ...) standardGeneric("dbGetRowCount"), valueClass = "numeric" ) DBI/R/dbFetch_DBIResult.R0000644000176200001440000000033314350241735014413 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbFetch_DBIResult <- function(res, n = -1, ...) { fetch(res, n = n, ...) } #' @rdname hidden_aliases #' @export setMethod("dbFetch", signature("DBIResult"), dbFetch_DBIResult) DBI/R/dbCanConnect.R0000644000176200001440000000173315071142015013515 0ustar liggesusers#' Check if a connection to a DBMS can be established #' #' Like [dbConnect()], but only checks validity without actually returning #' a connection object. The default implementation opens a connection #' and disconnects on success, but individual backends might implement #' a lighter-weight check. #' #' @template methods #' @templateVar method_name dbCanConnect #' #' @return A scalar logical. If `FALSE`, the `"reason"` attribute indicates #' a reason for failure. #' #' @inheritParams dbConnect #' @family DBIDriver generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' # SQLite only needs a path to the database. (Here, ":memory:" is a special #' # path that creates an in-memory database.) Other database drivers #' # will require more details (like user, password, host, port, etc.) #' dbCanConnect(RSQLite::SQLite(), ":memory:") setGeneric( "dbCanConnect", def = function(drv, ...) standardGeneric("dbCanConnect"), valueClass = "logical" ) DBI/R/dbListObjects_DBIConnection_ANY.R0000644000176200001440000000073215071142015017132 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbListObjects_DBIConnection_ANY <- function(conn, prefix = NULL, ...) { names <- dbListTables(conn) tables <- lapply(names, function(x) Id(table = x)) ret <- data.frame( table = I(unname(tables)), stringsAsFactors = FALSE ) ret$is_prefix <- rep_len(FALSE, nrow(ret)) ret } #' @rdname hidden_aliases #' @export setMethod( "dbListObjects", signature("DBIConnection", "ANY"), dbListObjects_DBIConnection_ANY ) DBI/R/interpolate.R0000644000176200001440000000770215071142015013524 0ustar liggesusersNULL #' @export #' @rdname sqlParseVariables sqlCommentSpec <- function(start, end, endRequired) { list(start = start, end = end, endRequired = endRequired) } #' @export #' @rdname sqlParseVariables sqlQuoteSpec <- function(start, end, escape = "", doubleEscape = TRUE) { list(start = start, end = end, escape = escape, doubleEscape = doubleEscape) } #' @export #' @rdname sqlParseVariables #' @param sql SQL to parse (a character string) #' @param quotes A list of `QuoteSpec` calls defining the quoting #' specification. #' @param comments A list of `CommentSpec` calls defining the commenting #' specification. sqlParseVariablesImpl <- function(sql, quotes, comments) { str_to_vec <- function(s) strsplit(s, "", fixed = TRUE)[[1L]] sql_arr <- c(str_to_vec(as.character(sql)), " ") # characters valid in variable names var_chars <- c(LETTERS, letters, 0:9, "_") # return values var_pos_start <- integer() var_pos_end <- integer() # internal helper variables quote_spec_offset <- 0L comment_spec_offset <- 0L sql_variable_start <- 0L # prepare comments & quotes for quicker comparisions for (c in seq_along(comments)) { comments[[c]][["start"]] <- str_to_vec(comments[[c]][["start"]]) comments[[c]][["end"]] <- str_to_vec(comments[[c]][["end"]]) } for (q in seq_along(quotes)) { quotes[[q]][["hasEscape"]] <- nchar(quotes[[q]][["escape"]]) > 0L } state <- "default" i <- 0L while (i < length(sql_arr)) { i <- i + 1L switch( state, default = { # variable if (sql_arr[[i]] == "?") { sql_variable_start <- i state <- "variable" next } # starting quoted area for (q in seq_along(quotes)) { if (identical(sql_arr[[i]], quotes[[q]][["start"]])) { quote_spec_offset <- q state <- "quote" break } } # we can abort here if the state has changed if (state != "default") { next } # starting comment for (c in seq_along(comments)) { comment_start_arr <- comments[[c]][["start"]] comment_start_length <- length(comment_start_arr) if ( identical( sql_arr[i:(i + comment_start_length - 1L)], comment_start_arr ) ) { comment_spec_offset <- c i <- i + comment_start_length state <- "comment" break } } }, variable = { if (!(sql_arr[[i]] %in% var_chars)) { # append current variable offsets to return vectors var_pos_start <- c(var_pos_start, sql_variable_start) # we have already read too much, go back i <- i - 1L var_pos_end <- c(var_pos_end, i) state <- "default" } }, quote = { # if we see backslash-like escapes, ignore next character if ( quotes[[quote_spec_offset]][["hasEscape"]] && identical(sql_arr[[i]], quotes[[quote_spec_offset]][[3]]) ) { i <- i + 1L next } # end quoted area if (identical(sql_arr[[i]], quotes[[quote_spec_offset]][["end"]])) { quote_spec_offset <- 0L state <- "default" } }, comment = { # end commented area comment_end_arr <- comments[[comment_spec_offset]][["end"]] comment_end_length <- length(comment_end_arr) if ( identical(sql_arr[i:(i + comment_end_length - 1L)], comment_end_arr) ) { i <- i + (comment_end_length - 1) comment_spec_offset <- 0L state <- "default" } } ) # } # if (quote_spec_offset > 0L) { stop("Unterminated literal") } if ( comment_spec_offset > 0L && comments[[comment_spec_offset]][["endRequired"]] ) { stop("Unterminated comment") } list(start = var_pos_start, end = var_pos_end) } DBI/R/make.db.names.R0000644000176200001440000000576715071142015013612 0ustar liggesusers#' Make R identifiers into legal SQL identifiers #' #' These methods are DEPRECATED. Please use [dbQuoteIdentifier()] #' (or possibly [dbQuoteString()]) instead. #' #' The algorithm in `make.db.names` first invokes `make.names` and #' then replaces each occurrence of a dot `.` by an underscore `_`. If #' `allow.keywords` is `FALSE` and identifiers collide with SQL #' keywords, a small integer is appended to the identifier in the form of #' `"_n"`. #' #' The set of SQL keywords is stored in the character vector #' `.SQL92Keywords` and reflects the SQL ANSI/ISO standard as documented #' in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily #' override or update this vector. #' #' @section Bugs: #' The current mapping is not guaranteed to be fully reversible: some SQL #' identifiers that get mapped into R identifiers with `make.names` and #' then back to SQL with [make.db.names()] will not be equal to the #' original SQL identifiers (e.g., compound SQL identifiers of the form #' `username.tablename` will loose the dot ``.''). #' #' @references The set of SQL keywords is stored in the character vector #' `.SQL92Keywords` and reflects the SQL ANSI/ISO standard as documented #' in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily #' override or update this vector. #' @aliases #' make.db.names #' SQLKeywords #' isSQLKeyword #' @param dbObj any DBI object (e.g., `DBIDriver`). #' @param snames a character vector of R identifiers (symbols) from which we #' need to make SQL identifiers. #' @param name a character vector with database identifier candidates we need #' to determine whether they are legal SQL identifiers or not. #' @param unique logical describing whether the resulting set of SQL names #' should be unique. Its default is `TRUE`. Following the SQL 92 #' standard, uniqueness of SQL identifiers is determined regardless of whether #' letters are upper or lower case. #' @param allow.keywords logical describing whether SQL keywords should be #' allowed in the resulting set of SQL names. Its default is `TRUE` #' @param keywords a character vector with SQL keywords, by default it's #' `.SQL92Keywords` defined by the DBI. #' @param case a character string specifying whether to make the comparison as #' lower case, upper case, or any of the two. it defaults to `any`. #' @param \dots any other argument are passed to the driver implementation. #' @return `make.db.names` returns a character vector of legal SQL #' identifiers corresponding to its `snames` argument. #' #' `SQLKeywords` returns a character vector of all known keywords for the #' database-engine associated with `dbObj`. #' #' `isSQLKeyword` returns a logical vector parallel to `name`. #' @export #' @keywords internal setGeneric( "make.db.names", def = function( dbObj, snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE, ... ) { standardGeneric("make.db.names") }, signature = c("dbObj", "snames"), valueClass = "character" ) DBI/R/dbSendQueryArrow_DBIConnection.R0000644000176200001440000000057615071142015017136 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbSendQueryArrow_DBIConnection <- function( conn, statement, params = NULL, ... ) { result <- dbSendQuery(conn, statement, params = params, ...) new("DBIResultArrowDefault", result = result) } #' @rdname hidden_aliases #' @export setMethod( "dbSendQueryArrow", signature("DBIConnection"), dbSendQueryArrow_DBIConnection ) DBI/R/21-dbAppendTableArrow.R0000644000176200001440000000276615144400570015127 0ustar liggesusers#' Insert rows into a table from an Arrow stream #' #' @description #' `r lifecycle::badge('experimental')` #' #' The `dbAppendTableArrow()` method assumes that the table has been created #' beforehand, e.g. with [dbCreateTableArrow()]. #' The default implementation calls [dbAppendTable()] for each chunk #' of the stream. #' Use [dbAppendTable()] to append data from a data.frame. #' #' @inheritParams dbReadTable #' @param value An object coercible with [nanoarrow::as_nanoarrow_array_stream()]. #' @inheritParams sqlAppendTableTemplate #' #' @template methods #' @templateVar method_name dbAppendTableArrow #' #' @inherit DBItest::spec_arrow_append_table_arrow return #' @inheritSection DBItest::spec_arrow_append_table_arrow Failure modes #' @inheritSection DBItest::spec_arrow_append_table_arrow Specification #' #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' dbCreateTableArrow(con, "iris", iris[0, ]) #' dbAppendTableArrow(con, "iris", iris[1:5, ]) #' dbReadTable(con, "iris") #' dbDisconnect(con) setGeneric("dbAppendTableArrow", def = function(conn, name, value, ...) { otel_local_active_span( "INSERT INTO", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn), db.operation.name = "INSERT INTO" ) ) standardGeneric("dbAppendTableArrow") }) DBI/R/dbDriver_character.R0000644000176200001440000000032114350241735014751 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbDriver_character <- function(drvName, ...) { findDriver(drvName)(...) } #' @rdname hidden_aliases setMethod("dbDriver", signature("character"), dbDriver_character) DBI/R/dbiDataType_integer.R0000644000176200001440000000017514350241735015112 0ustar liggesusers#' @usage NULL dbiDataType_integer <- function(x) "INT" setMethod("dbiDataType", signature("integer"), dbiDataType_integer) DBI/R/02-DBIDriver.R0000644000176200001440000000300415071142015013156 0ustar liggesusersNULL #' DBIDriver class #' #' Base class for all DBMS drivers (e.g., RSQLite, MySQL, PostgreSQL). #' The virtual class `DBIDriver` defines the operations for creating #' connections and defining data type mappings. Actual driver classes, for #' instance `RPostgres`, `RMariaDB`, etc. implement these operations in a #' DBMS-specific manner. #' #' @docType class #' @name DBIDriver-class #' @family DBI classes #' @family DBIDriver generics #' @export setClass("DBIDriver", contains = c("DBIObject", "VIRTUAL")) show_driver <- function(object) { cat("<", is(object)[1], ">\n", sep = "") } findDriver <- function(drvName) { # If it exists in the global environment, use that d <- get2(drvName, globalenv()) if (!is.null(d)) { return(d) } # Otherwise, see if the appropriately named package is available if (is_attached(drvName)) { d <- get2(drvName, asNamespace(drvName)) if (!is.null(d)) return(d) } pkgName <- paste0("R", drvName) # First, see if package with name R + drvName is available if (is_attached(pkgName)) { d <- get2(drvName, asNamespace(pkgName)) if (!is.null(d)) return(d) } # Can't find it: stop( "Couldn't find driver ", drvName, ". Looked in:\n", "* global namespace\n", "* in package called ", drvName, "\n", "* in package called ", pkgName, call. = FALSE ) } get2 <- function(x, env) { if (!exists(x, envir = env)) { return(NULL) } get(x, envir = env) } is_attached <- function(x) { x %in% loadedNamespaces() } DBI/R/summary.R0000644000176200001440000000002614350241735012673 0ustar liggesuserssetGeneric("summary") DBI/R/dbBegin.R0000644000176200001440000000015715071142015012525 0ustar liggesusers#' @export #' @rdname transactions setGeneric("dbBegin", def = function(conn, ...) standardGeneric("dbBegin")) DBI/R/dbUnloadDriver.R0000644000176200001440000000035215071142015014074 0ustar liggesusers#' @description #' `dbUnloadDriver()` is not implemented for modern backends. #' @rdname dbDriver #' @family DBIDriver generics #' @export setGeneric("dbUnloadDriver", def = function(drv, ...) { standardGeneric("dbUnloadDriver") }) DBI/R/dbExecute.R0000644000176200001440000000426315071142015013105 0ustar liggesusers#' Change database state #' #' Executes a statement and returns the number of rows affected. #' `dbExecute()` comes with a default implementation #' (which should work with most backends) that calls #' [dbSendStatement()], then [dbGetRowsAffected()], ensuring that #' the result is always freed by [dbClearResult()]. #' For passing query parameters, see [dbBind()], in particular #' the "The command execution flow" section. #' #' You can also use `dbExecute()` to call a stored procedure #' that performs data manipulation or other actions that do not return a result set. #' To execute a stored procedure that returns a result set, #' or a data manipulation query that also returns a result set #' such as `INSERT INTO ... RETURNING ...`, use [dbGetQuery()] instead. #' #' @template methods #' @templateVar method_name dbExecute #' #' @section Implementation notes: #' Subclasses should override this method only if they provide some sort of #' performance optimization. #' #' @inherit DBItest::spec_result_execute return #' @inheritSection DBItest::spec_result_execute Failure modes #' @inheritSection DBItest::spec_result_execute Additional arguments #' @inheritSection DBItest::spec_result_execute Specification #' @inheritSection DBItest::spec_result_execute Specification for the `immediate` argument #' #' @inheritParams dbGetQuery #' @param statement a character string containing SQL. #' @family DBIConnection generics #' @family command execution generics #' @seealso For queries: [dbSendQuery()] and [dbGetQuery()]. #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "cars", head(cars, 3)) #' dbReadTable(con, "cars") # there are 3 rows #' dbExecute( #' con, #' "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" #' ) #' dbReadTable(con, "cars") # there are now 6 rows #' #' # Pass values using the param argument: #' dbExecute( #' con, #' "INSERT INTO cars (speed, dist) VALUES (?, ?)", #' params = list(4:7, 5:8) #' ) #' dbReadTable(con, "cars") # there are now 10 rows #' #' dbDisconnect(con) setGeneric("dbExecute", def = function(conn, statement, ...) { standardGeneric("dbExecute") }) DBI/R/dbAppendTable_DBIConnection.R0000644000176200001440000000116515071142015016356 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbAppendTable_DBIConnection <- function( conn, name, value, ..., row.names = NULL ) { if (!is.null(row.names)) { stop("Can't pass `row.names` to `dbAppendTable()`", call. = FALSE) } stopifnot(is.data.frame(value)) query <- sqlAppendTableTemplate( con = conn, table = name, values = value, row.names = row.names, prefix = "?", pattern = "", ... ) dbExecute(conn, query, params = unname(as.list(value))) } #' @rdname hidden_aliases #' @export setMethod( "dbAppendTable", signature("DBIConnection"), dbAppendTable_DBIConnection ) DBI/R/SQLKeywords.R0000644000176200001440000000040315071142015013354 0ustar liggesusers## SQL ANSI 92 (plus ISO's) keywords --- all 220 of them! ## (See pp. 22 and 23 in X/Open SQL and RDA, 1994, isbn 1-872630-68-8) #' @export setGeneric( "SQLKeywords", def = function(dbObj, ...) standardGeneric("SQLKeywords"), valueClass = "character" ) DBI/R/dbQuoteLiteral.R0000644000176200001440000000254215071142015014113 0ustar liggesusers#' Quote literal values #' #' @description #' Call these methods to generate a string that is suitable for #' use in a query as a literal value of the correct type, to make sure that you #' generate valid SQL and protect against SQL injection attacks. #' #' @inheritParams dbQuoteString #' @param x A vector to quote as string. #' #' @template methods #' @templateVar method_name dbQuoteLiteral #' #' @inherit DBItest::spec_sql_quote_literal return #' @inheritSection DBItest::spec_sql_quote_literal Failure modes #' @inheritSection DBItest::spec_sql_quote_literal Specification #' #' @family DBIResult generics #' @export #' @examples #' # Quoting ensures that arbitrary input is safe for use in a query #' name <- "Robert'); DROP TABLE Students;--" #' dbQuoteLiteral(ANSI(), name) #' #' # NAs become NULL #' dbQuoteLiteral(ANSI(), c(1:3, NA)) #' #' # Logicals become integers by default #' dbQuoteLiteral(ANSI(), c(TRUE, FALSE, NA)) #' #' # Raw vectors become hex strings by default #' dbQuoteLiteral(ANSI(), list(as.raw(1:3), NULL)) #' #' # SQL vectors are always passed through as is #' var_name <- SQL("select") #' var_name #' dbQuoteLiteral(ANSI(), var_name) #' #' # This mechanism is used to prevent double escaping #' dbQuoteLiteral(ANSI(), dbQuoteLiteral(ANSI(), name)) setGeneric("dbQuoteLiteral", def = function(conn, x, ...) { standardGeneric("dbQuoteLiteral") }) DBI/R/show_DBIResult.R0000644000176200001440000000060514350241735014036 0ustar liggesusers#' @rdname hidden_aliases #' @param object Object to display #' @usage NULL show_DBIResult <- function(object) { # to protect drivers that fail to implement the required methods (e.g., # RPostgreSQL) tryCatch( show_result(object), error = function(e) NULL ) invisible(NULL) } #' @rdname hidden_aliases #' @export setMethod("show", signature("DBIResult"), show_DBIResult) DBI/R/show_DBIConnector.R0000644000176200001440000000051114350241735014506 0ustar liggesusers#' @rdname hidden_aliases #' @param object Object to display #' @usage NULL show_DBIConnector <- function(object) { cat("") show(object@.drv) cat("Arguments:\n") show(object@.conn_args) invisible(NULL) } #' @rdname hidden_aliases #' @export setMethod("show", signature("DBIConnector"), show_DBIConnector) DBI/R/dbFetchArrow_DBIResultArrow.R0000644000176200001440000000146315071142015016436 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbFetchArrow_DBIResultArrow <- function(res, ...) { chunk <- dbFetchArrowChunk_DBIResultArrow(res) # Corner case: add empty chunk only for zero rows, for schema if (chunk$length == 0) { return(nanoarrow::basic_array_stream( list(), schema = nanoarrow::infer_nanoarrow_schema(chunk), validate = FALSE )) } out <- list(chunk) repeat { chunk <- dbFetchArrowChunk_DBIResultArrow(res) if (chunk$length == 0) { return(nanoarrow::basic_array_stream( out, schema = nanoarrow::infer_nanoarrow_schema(out[[1]]), validate = FALSE )) } out <- c(out, list(chunk)) } } #' @rdname hidden_aliases #' @export setMethod( "dbFetchArrow", signature("DBIResultArrow"), dbFetchArrow_DBIResultArrow ) DBI/R/dbCanConnect_DBIDriver.R0000644000176200001440000000062714350241735015360 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbCanConnect_DBIDriver <- function(drv, ...) { tryCatch( { con <- dbConnect(drv, ...) dbDisconnect(con) TRUE }, error = function(e) { structure( FALSE, reason = conditionMessage(e) ) } ) } #' @rdname hidden_aliases #' @export setMethod("dbCanConnect", signature("DBIDriver"), dbCanConnect_DBIDriver) DBI/R/dbiDataType_list.R0000644000176200001440000000037514350241735014432 0ustar liggesusersdbiDataType_list <- function(x) { is_raw <- vapply(x, is.raw, logical(1)) if (!all(is_raw)) { stop("Only lists of raw vectors are currently supported", call. = FALSE) } "BLOB" } setMethod("dbiDataType", signature("list"), dbiDataType_list) DBI/R/DBIConnector.R0000644000176200001440000000303115071142015013436 0ustar liggesusersNULL #' DBIConnector class #' #' Wraps objects of the [DBIDriver-class] class to include connection options. #' The purpose of this class is to store both the driver #' and the connection options. #' A database connection can be established #' with a call to [dbConnect()], passing only that object #' without additional arguments. #' #' To prevent leakage of passwords and other credentials, #' this class supports delayed evaluation. #' All arguments can optionally be a function (callable without arguments). #' In such a case, the function is evaluated transparently when connecting in #' [dbGetConnectArgs()]. #' # FIXME: Include this # Database backends can take advantage of this feature by returning an # instance of this class instead of `DBIDriver`. # See the implementation of [RSQLite::SQLite()] for an example. #' #' @docType class #' @name DBIConnector-class #' @family DBI classes #' @family DBIConnector generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' # Create a connector: #' cnr <- new("DBIConnector", #' .drv = RSQLite::SQLite(), #' .conn_args = list(dbname = ":memory:") #' ) #' cnr #' #' # Establish a connection through this connector: #' con <- dbConnect(cnr) #' con #' #' # Access the database through this connection: #' dbGetQuery(con, "SELECT 1 AS a") #' dbDisconnect(con) setClass( "DBIConnector", slots = c(".drv" = "DBIDriver", ".conn_args" = "list"), contains = c("DBIObject") ) names2 <- function(x) { if (is.null(names(x))) { rep("", length(x)) } else { names(x) } } DBI/R/dbIsReadOnly.R0000644000176200001440000000075415071142015013515 0ustar liggesusers#' Is this DBMS object read only? #' #' This generic tests whether a database object is read only. #' #' @inheritParams dbGetInfo #' #' @template methods #' @templateVar method_name dbIsReadOnly #' #' @family DBIDriver generics #' @family DBIConnection generics #' @family DBIResult generics #' @family DBIConnector generics #' @export #' @examples #' dbIsReadOnly(ANSI()) setGeneric( "dbIsReadOnly", def = function(dbObj, ...) standardGeneric("dbIsReadOnly"), valueClass = "logical" ) DBI/R/dbGetRowsAffected.R0000644000176200001440000000165015071142015014514 0ustar liggesusers#' The number of rows affected #' #' This method returns the number of rows that were added, deleted, or updated #' by a data manipulation statement. #' #' @inheritSection dbBind The command execution flow #' #' @template methods #' @templateVar method_name dbGetRowsAffected #' #' @inherit DBItest::spec_meta_get_rows_affected return #' @inheritSection DBItest::spec_meta_get_rows_affected Failure modes #' #' @inheritParams dbClearResult #' @family DBIResult generics #' @family command execution generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendStatement(con, "DELETE FROM mtcars") #' dbGetRowsAffected(rs) #' nrow(mtcars) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbGetRowsAffected", def = function(res, ...) standardGeneric("dbGetRowsAffected"), valueClass = "numeric" ) DBI/R/SQLKeywords_DBIObject.R0000644000176200001440000000035415071142015015166 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL SQLKeywords_DBIObject <- function(dbObj, ...) .SQL92Keywords #' @rdname hidden_aliases setMethod( "SQLKeywords", signature("DBIObject"), SQLKeywords_DBIObject, valueClass = "character" ) DBI/R/15-dbBind.R0000644000176200001440000002167415071142015012607 0ustar liggesusers#' Bind values to a parameterized/prepared statement #' #' @description #' For parametrized or prepared statements, #' the [dbSendQuery()], [dbSendQueryArrow()], and [dbSendStatement()] functions #' can be called with statements that contain placeholders for values. #' The `dbBind()` and `dbBindArrow()` functions bind these placeholders #' to actual values, #' and are intended to be called on the result set #' before calling [dbFetch()] or [dbFetchArrow()]. #' The values are passed to `dbBind()` as lists or data frames, #' and to `dbBindArrow()` as a stream #' created by [nanoarrow::as_nanoarrow_array_stream()]. #' #' `r lifecycle::badge('experimental')` #' #' `dbBindArrow()` is experimental, as are the other `*Arrow` functions. #' `dbSendQuery()` is compatible with `dbBindArrow()`, and `dbSendQueryArrow()` #' is compatible with `dbBind()`. #' #' @details #' \pkg{DBI} supports parametrized (or prepared) queries and statements #' via the `dbBind()` and `dbBindArrow()` generics. #' Parametrized queries are different from normal queries #' in that they allow an arbitrary number of placeholders, #' which are later substituted by actual values. #' Parametrized queries (and statements) serve two purposes: #' #' - The same query can be executed more than once with different values. #' The DBMS may cache intermediate information for the query, #' such as the execution plan, and execute it faster. #' - Separation of query syntax and parameters protects against SQL injection. #' #' The placeholder format is currently not specified by \pkg{DBI}; #' in the future, a uniform placeholder syntax may be supported. #' Consult the backend documentation for the supported formats. #' For automated testing, backend authors specify the placeholder syntax with #' the `placeholder_pattern` tweak. #' Known examples are: #' #' - `?` (positional matching in order of appearance) in \pkg{RMariaDB} and \pkg{RSQLite} #' - `$1` (positional matching by index) in \pkg{RPostgres} and \pkg{RSQLite} #' - `:name` and `$name` (named matching) in \pkg{RSQLite} #' #' @section The data retrieval flow: #' #' This section gives a complete overview over the flow #' for the execution of queries that return tabular data as data frames. #' #' Most of this flow, except repeated calling of [dbBind()] or [dbBindArrow()], #' is implemented by [dbGetQuery()], which should be sufficient #' unless you want to access the results in a paged way #' or you have a parameterized query that you want to reuse. #' This flow requires an active connection established by [dbConnect()]. #' See also `vignette("dbi-advanced")` for a walkthrough. #' #' 1. Use [dbSendQuery()] to create a result set object of class #' [DBIResult-class]. #' 1. Optionally, bind query parameters with [dbBind()] or [dbBindArrow()]. #' This is required only if the query contains placeholders #' such as `?` or `$1`, depending on the database backend. #' 1. Optionally, use [dbColumnInfo()] to retrieve the structure of the result set #' without retrieving actual data. #' 1. Use [dbFetch()] to get the entire result set, a page of results, #' or the remaining rows. #' Fetching zero rows is also possible to retrieve the structure of the result set #' as a data frame. #' This step can be called multiple times. #' Only forward paging is supported, you need to cache previous pages #' if you need to navigate backwards. #' 1. Use [dbHasCompleted()] to tell when you're done. #' This method returns `TRUE` if no more rows are available for fetching. #' 1. Repeat the last four steps as necessary. #' 1. Use [dbClearResult()] to clean up the result set object. #' This step is mandatory even if no rows have been fetched #' or if an error has occurred during the processing. #' It is good practice to use [on.exit()] or [withr::defer()] #' to ensure that this step is always executed. #' #' @section The data retrieval flow for Arrow streams: #' #' This section gives a complete overview over the flow #' for the execution of queries that return tabular data as an Arrow stream. #' #' Most of this flow, except repeated calling of [dbBindArrow()] or [dbBind()], #' is implemented by [dbGetQueryArrow()], #' which should be sufficient #' unless you have a parameterized query that you want to reuse. #' This flow requires an active connection established by [dbConnect()]. #' See also `vignette("dbi-advanced")` for a walkthrough. #' #' 1. Use [dbSendQueryArrow()] to create a result set object of class #' [DBIResultArrow-class]. #' 1. Optionally, bind query parameters with [dbBindArrow()] or [dbBind()]. #' This is required only if the query contains placeholders #' such as `?` or `$1`, depending on the database backend. #' 1. Use [dbFetchArrow()] to get a data stream. #' 1. Repeat the last two steps as necessary. #' 1. Use [dbClearResult()] to clean up the result set object. #' This step is mandatory even if no rows have been fetched #' or if an error has occurred during the processing. #' It is good practice to use [on.exit()] or [withr::defer()] #' to ensure that this step is always executed. #' #' @section The command execution flow: #' #' This section gives a complete overview over the flow #' for the execution of SQL statements that have side effects #' such as stored procedures, inserting or deleting data, #' or setting database or connection options. #' Most of this flow, except repeated calling of [dbBindArrow()], #' is implemented by [dbExecute()], which should be sufficient #' for non-parameterized queries. #' This flow requires an active connection established by [dbConnect()]. #' See also `vignette("dbi-advanced")` for a walkthrough. #' #' 1. Use [dbSendStatement()] to create a result set object of class #' [DBIResult-class]. #' For some queries you need to pass `immediate = TRUE`. #' 1. Optionally, bind query parameters with[dbBind()] or [dbBindArrow()]. #' This is required only if the query contains placeholders #' such as `?` or `$1`, depending on the database backend. #' 1. Optionally, use [dbGetRowsAffected()] to retrieve the number #' of rows affected by the query. #' 1. Repeat the last two steps as necessary. #' 1. Use [dbClearResult()] to clean up the result set object. #' This step is mandatory even if no rows have been fetched #' or if an error has occurred during the processing. #' It is good practice to use [on.exit()] or [withr::defer()] #' to ensure that this step is always executed. #' #' @template methods #' @templateVar method_name dbBind #' #' @inherit DBItest::spec_meta_bind return #' @inheritSection DBItest::spec_meta_bind Failure modes #' @inheritSection DBItest::spec_meta_bind Specification #' #' @inheritParams dbClearResult #' @param params For `dbBind()`, a list of values, named or unnamed, #' or a data frame, with one element/column per query parameter. #' For `dbBindArrow()`, values as a nanoarrow stream, #' with one column per query parameter. #' @family DBIResult generics #' @family DBIResultArrow generics #' @family data retrieval generics #' @family command execution generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' # Data frame flow: #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "iris", iris) #' #' # Using the same query for different values #' iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") #' dbBind(iris_result, list(2.3)) #' dbFetch(iris_result) #' dbBind(iris_result, list(3)) #' dbFetch(iris_result) #' dbClearResult(iris_result) #' #' # Executing the same statement with different values at once #' iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = $species") #' dbBind(iris_result, list(species = c("setosa", "versicolor", "unknown"))) #' dbGetRowsAffected(iris_result) #' dbClearResult(iris_result) #' #' nrow(dbReadTable(con, "iris")) #' #' dbDisconnect(con) #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' #' # Arrow flow: #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "iris", iris) #' #' # Using the same query for different values #' iris_result <- dbSendQueryArrow(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") #' dbBindArrow( #' iris_result, #' nanoarrow::as_nanoarrow_array_stream(data.frame(2.3, fix.empty.names = FALSE)) #' ) #' as.data.frame(dbFetchArrow(iris_result)) #' dbBindArrow( #' iris_result, #' nanoarrow::as_nanoarrow_array_stream(data.frame(3, fix.empty.names = FALSE)) #' ) #' as.data.frame(dbFetchArrow(iris_result)) #' dbClearResult(iris_result) #' #' # Executing the same statement with different values at once #' iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = $species") #' dbBindArrow(iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame( #' species = c("setosa", "versicolor", "unknown") #' ))) #' dbGetRowsAffected(iris_result) #' dbClearResult(iris_result) #' #' nrow(dbReadTable(con, "iris")) #' #' dbDisconnect(con) setGeneric("dbBind", def = function(res, params, ...) standardGeneric("dbBind")) DBI/R/dbFetch_DBIResultArrow.R0000644000176200001440000000057315071142015015424 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbFetch_DBIResultArrow <- function(res, n = -1, ...) { if (is.infinite(n)) { n <- -1 } if (n != -1) { stop("Cannot dbFetch() an Arrow result unless n = -1") } as.data.frame( dbFetchArrow(res, ...) ) } #' @rdname hidden_aliases #' @export setMethod("dbFetch", signature("DBIResultArrow"), dbFetch_DBIResultArrow) DBI/R/data-types.R0000644000176200001440000000005514350241735013253 0ustar liggesuserssetOldClass("difftime") setOldClass("AsIs") DBI/R/data.R0000644000176200001440000000162214350241735012112 0ustar liggesusersNULL # Coercion rules --------------------------------------------------------------- coerce <- function(sqlvar, from, to) { list(from = from, to = to) } sqlDate <- function() { coerce( function(x) as.integer(x), function(x) { stopifnot(is.integer(x)) structure(x, class = "Date") } ) } sqlDateTime <- function() { coerce( function(x) as.numeric(x), function(x) { stopifnot(is.numeric(x)) structure(x, class = c("POSIXct", "POSIXt"), tzone = "UTC") } ) } sqlSerialize <- function() { coerce( function(x) { lapply(x, serialize, connection = NULL) }, function(x) { lapply(x, unserialize) } ) } sqlBoolean <- function() { coerce( function(x) as.integer(x), function(x) as.logical(x) ) } sqlFactor <- function(levels) { coerce( function(x) as.integer(x), function(x) factor(x, levels = levels) ) } DBI/R/dbSetDataMappings.R0000644000176200001440000000141115071142015014517 0ustar liggesusers#' Set data mappings between an DBMS and R. #' #' This generic is deprecated since no working implementation was ever produced. #' #' Sets one or more conversion functions to handle the translation of DBMS data #' types to R objects. This is only needed for non-primitive data, since all #' DBI drivers handle the common base types (integers, numeric, strings, etc.) #' #' The details on conversion functions (e.g., arguments, whether they can invoke #' initializers and/or destructors) have not been specified. #' #' @inheritParams dbClearResult #' @keywords internal #' @param flds a field description object as returned by `dbColumnInfo`. #' @export setGeneric("dbSetDataMappings", def = function(res, flds, ...) { .Deprecated() standardGeneric("dbSetDataMappings") }) DBI/R/dbFetchArrowChunk.R0000644000176200001440000000310115071142015014526 0ustar liggesusers#' Fetch the next batch of records from a previously executed query as an Arrow object #' #' @description #' `r lifecycle::badge('experimental')` #' #' Fetch the next chunk of the result set and return it as an Arrow object. #' The chunk size is implementation-specific. #' Use [dbFetchArrow()] to fetch all results. #' #' @inheritSection dbBind The data retrieval flow for Arrow streams #' #' @template methods #' @templateVar method_name dbFetchArrowChunk #' #' @inherit DBItest::spec_arrow_fetch_arrow_chunk return #' @inheritSection DBItest::spec_arrow_fetch_arrow_chunk Failure modes #' @inheritSection DBItest::spec_arrow_fetch_arrow_chunk Specification #' #' @param res An object inheriting from [DBI::DBIResultArrow][DBIResultArrow-class], #' created by [dbSendQueryArrow()]. #' @param ... Other arguments passed on to methods. #' @seealso Close the result set with [dbClearResult()] as soon as you #' finish retrieving the records you want. #' @family DBIResultArrow generics #' @family data retrieval generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' #' # Fetch all results #' rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") #' dbHasCompleted(rs) #' as.data.frame(dbFetchArrowChunk(rs)) #' dbHasCompleted(rs) #' as.data.frame(dbFetchArrowChunk(rs)) #' dbClearResult(rs) #' #' dbDisconnect(con) setGeneric("dbFetchArrowChunk", def = function(res, ...) { standardGeneric("dbFetchArrowChunk") }) DBI/R/dbListTables.R0000644000176200001440000000152515071142015013547 0ustar liggesusers#' List remote tables #' #' Returns the unquoted names of remote tables accessible through this #' connection. #' This should include views and temporary objects, but not all database backends #' (in particular \pkg{RMariaDB} and \pkg{RMySQL}) support this. #' #' @template methods #' @templateVar method_name dbListTables #' #' @inherit DBItest::spec_sql_list_tables return #' @inheritSection DBItest::spec_sql_list_tables Failure modes #' #' @inheritParams dbGetQuery #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbListTables(con) #' dbWriteTable(con, "mtcars", mtcars) #' dbListTables(con) #' #' dbDisconnect(con) setGeneric( "dbListTables", def = function(conn, ...) standardGeneric("dbListTables"), valueClass = "character" ) DBI/R/dbSendStatement_DBIConnection_character.R0000644000176200001440000000046715071142015020775 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbSendStatement_DBIConnection_character <- function(conn, statement, ...) { dbSendQuery(conn, statement, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbSendStatement", signature("DBIConnection", "character"), dbSendStatement_DBIConnection_character ) DBI/R/dbGetRowCount_DBIResultArrow.R0000644000176200001440000000040415071142015016604 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetRowCount_DBIResultArrow <- function(res, ...) { dbGetRowCount(res@result, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbGetRowCount", signature("DBIResultArrow"), dbGetRowCount_DBIResultArrow ) DBI/R/dbQuoteIdentifier.R0000644000176200001440000000263715071142015014606 0ustar liggesusers#' Quote identifiers #' #' Call this method to generate a string that is suitable for #' use in a query as a column or table name, to make sure that you #' generate valid SQL and protect against SQL injection attacks. The inverse #' operation is [dbUnquoteIdentifier()]. #' #' @inheritParams dbGetQuery #' @param x A character vector, [SQL] or [Id] object to quote as identifier. #' @param ... Other arguments passed on to methods. #' #' @template methods #' @templateVar method_name dbQuoteIdentifier #' #' @inherit DBItest::spec_sql_quote_identifier return #' @inheritSection DBItest::spec_sql_quote_identifier Failure modes #' @inheritSection DBItest::spec_sql_quote_identifier Specification #' #' @family DBIConnection generics #' @export #' @examples #' # Quoting ensures that arbitrary input is safe for use in a query #' name <- "Robert'); DROP TABLE Students;--" #' dbQuoteIdentifier(ANSI(), name) #' #' # Use Id() to specify other components such as the schema #' id_name <- Id(schema = "schema_name", table = "table_name") #' id_name #' dbQuoteIdentifier(ANSI(), id_name) #' #' # SQL vectors are always passed through as is #' var_name <- SQL("select") #' var_name #' dbQuoteIdentifier(ANSI(), var_name) #' #' # This mechanism is used to prevent double escaping #' dbQuoteIdentifier(ANSI(), dbQuoteIdentifier(ANSI(), name)) setGeneric("dbQuoteIdentifier", def = function(conn, x, ...) { standardGeneric("dbQuoteIdentifier") }) DBI/R/01-DBIObject.R0000644000176200001440000000273214602466070013150 0ustar liggesusersNULL #' DBIObject class #' #' Base class for all other DBI classes (e.g., drivers, connections). This #' is a virtual Class: No objects may be created from it. #' #' More generally, the DBI defines a very small set of classes and generics that #' allows users and applications access DBMS with a common interface. The #' virtual classes are `DBIDriver` that individual drivers extend, #' `DBIConnection` that represent instances of DBMS connections, and #' `DBIResult` that represent the result of a DBMS statement. These three #' classes extend the basic class of `DBIObject`, which serves as the root #' or parent of the class hierarchy. #' #' @section Implementation notes: #' An implementation MUST provide methods for the following generics: #' #' \itemize{ #' \item [dbGetInfo()]. #' } #' #' It MAY also provide methods for: #' #' \itemize{ #' \item [summary()]. Print a concise description of the #' object. The default method invokes `dbGetInfo(dbObj)` and prints #' the name-value pairs one per line. Individual implementations may #' tailor this appropriately. #' } #' #' @docType class #' @family DBI classes #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' drv <- RSQLite::SQLite() #' con <- dbConnect(drv) #' #' rs <- dbSendQuery(con, "SELECT 1") #' is(drv, "DBIObject") ## True #' is(con, "DBIObject") ## True #' is(rs, "DBIObject") #' #' dbClearResult(rs) #' dbDisconnect(con) #' @export #' @name DBIObject-class setClass("DBIObject", "VIRTUAL") DBI/R/dbListFields_DBIConnection_character.R0000644000176200001440000000043715071142015020256 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbListFields_DBIConnection_character <- function(conn, name, ...) { list_fields(conn, name) } #' @rdname hidden_aliases #' @export setMethod( "dbListFields", signature("DBIConnection", "character"), dbListFields_DBIConnection_character ) DBI/R/dbGetStatement.R0000644000176200001440000000143415071142015014104 0ustar liggesusers#' Get the statement associated with a result set #' #' Returns the statement that was passed to [dbSendQuery()] #' or [dbSendStatement()]. #' #' @template methods #' @templateVar method_name dbGetStatement #' #' @inherit DBItest::spec_meta_get_statement return #' @inheritSection DBItest::spec_meta_get_statement Failure modes #' #' @inheritParams dbClearResult #' @family DBIResult generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendQuery(con, "SELECT * FROM mtcars") #' dbGetStatement(rs) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbGetStatement", def = function(res, ...) standardGeneric("dbGetStatement"), valueClass = "character" ) DBI/R/12-dbCreateTable.R0000644000176200001440000000336415144400570014103 0ustar liggesusers#' Create a table in the database #' #' The default `dbCreateTable()` method calls [sqlCreateTable()] and #' [dbExecute()]. #' Use [dbCreateTableArrow()] to create a table from an Arrow schema. #' #' Backends compliant to ANSI SQL 99 don't need to override it. #' Backends with a different SQL syntax can override `sqlCreateTable()`, #' backends with entirely different ways to create tables need to #' override this method. #' #' The `row.names` argument is not supported by this method. #' Process the values with [sqlRownamesToColumn()] before calling this method. #' #' The argument order is different from the `sqlCreateTable()` method, the #' latter will be adapted in a later release of DBI. #' #' @inheritParams dbReadTable #' @param row.names Must be `NULL`. #' @inheritParams sqlCreateTable #' #' @inherit DBItest::spec_sql_create_table return #' @inheritSection DBItest::spec_sql_create_table Failure modes #' @inheritSection DBItest::spec_sql_create_table Additional arguments #' @inheritSection DBItest::spec_sql_create_table Specification #' #' @template methods #' @templateVar method_name dbCreateTable #' #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' dbCreateTable(con, "iris", iris) #' dbReadTable(con, "iris") #' dbDisconnect(con) setGeneric( "dbCreateTable", def = function(conn, name, fields, ..., row.names = NULL, temporary = FALSE) { otel_local_active_span( "CREATE TABLE", conn, label = .dbi_get_collection_name(name, conn), attributes = list( db.collection.name = .dbi_get_collection_name(name, conn), db.operation.name = "CREATE TABLE" ) ) standardGeneric("dbCreateTable") } ) DBI/R/show_Id.R0000644000176200001440000000035114537352607012603 0ustar liggesusers#' @rdname hidden_aliases #' @param object Table object to print #' @usage NULL show_Id <- function(object) { cat(toString(object), "\n", sep = "") } #' @rdname hidden_aliases #' @export setMethod("show", signature("Id"), show_Id) DBI/R/fetch.R0000644000176200001440000000022015071142015012253 0ustar liggesusers#' @rdname dbFetch #' @export setGeneric( "fetch", def = function(res, n = -1, ...) standardGeneric("fetch"), valueClass = "data.frame" ) DBI/R/dbGetInfo_DBIResult.R0000644000176200001440000000055014350241735014716 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbGetInfo_DBIResult <- function(dbObj, ...) { list( statement = dbGetStatement(dbObj), row.count = dbGetRowCount(dbObj), rows.affected = dbGetRowsAffected(dbObj), has.completed = dbHasCompleted(dbObj) ) } #' @rdname hidden_aliases setMethod("dbGetInfo", signature("DBIResult"), dbGetInfo_DBIResult) DBI/R/dbiDataType.R0000644000176200001440000000012115071142015013354 0ustar liggesuserssetGeneric("dbiDataType", def = function(x, ...) standardGeneric("dbiDataType")) DBI/R/dbExecute_DBIConnection_character.R0000644000176200001440000000054415071142015017615 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbExecute_DBIConnection_character <- function(conn, statement, ...) { rs <- dbSendStatement(conn, statement, ...) on.exit(dbClearResult(rs)) dbGetRowsAffected(rs) } #' @rdname hidden_aliases #' @export setMethod( "dbExecute", signature("DBIConnection", "character"), dbExecute_DBIConnection_character ) DBI/R/dbiDataType_difftime.R0000644000176200001440000000020114350241735015232 0ustar liggesusers#' @usage NULL dbiDataType_difftime <- function(x) "TIME" setMethod("dbiDataType", signature("difftime"), dbiDataType_difftime) DBI/R/dbReadTableArrow.R0000644000176200001440000000251415144400570014342 0ustar liggesusers#' Read database tables as Arrow objects #' #' @description #' `r lifecycle::badge('experimental')` #' #' Reads a database table as an Arrow object. #' Use [dbReadTable()] instead to obtain a data frame. #' #' @details #' This function returns an Arrow object. #' Convert it to a data frame with [as.data.frame()] or #' use [dbReadTable()] to obtain a data frame. #' #' @template methods #' @templateVar method_name dbReadTableArrow #' #' @inherit DBItest::spec_arrow_read_table_arrow return #' @inheritSection DBItest::spec_arrow_read_table_arrow Failure modes #' @inheritSection DBItest::spec_arrow_read_table_arrow Specification #' #' @inheritParams dbGetQuery #' @inheritParams dbReadTable #' @family DBIConnection generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' # Read data as Arrow table #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars[1:10, ]) #' dbReadTableArrow(con, "mtcars") #' #' dbDisconnect(con) setGeneric("dbReadTableArrow", def = function(conn, name, ...) { require_arrow() otel_local_active_span( "dbReadTableArrow", conn, label = .dbi_get_collection_name(name, conn), attributes = list(db.collection.name = .dbi_get_collection_name(name, conn)) ) standardGeneric("dbReadTableArrow") }) DBI/R/dbiDataType_AsIs.R0000644000176200001440000000022514350241735014310 0ustar liggesusersdbiDataType_AsIs <- function(x) { oldClass(x) <- oldClass(x)[-1] dbiDataType(x) } setMethod("dbiDataType", signature("AsIs"), dbiDataType_AsIs) DBI/R/dbReadTable_DBIConnection_Id.R0000644000176200001440000000044515071142015016436 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbReadTable_DBIConnection_Id <- function(conn, name, ...) { dbReadTable(conn, dbQuoteIdentifier(conn, name), ...) } #' @rdname hidden_aliases #' @export setMethod( "dbReadTable", signature("DBIConnection", "Id"), dbReadTable_DBIConnection_Id ) DBI/R/sqlParseVariables.R0000644000176200001440000000214315071142015014613 0ustar liggesusers#' Parse interpolated variables from SQL. #' #' If you're implementing a backend that uses non-ANSI quoting or commenting #' rules, you'll need to implement a method for `sqlParseVariables` that #' calls `sqlParseVariablesImpl` with the appropriate quote and #' comment specifications. #' #' #' @param start,end Start and end characters for quotes and comments #' @param endRequired Is the ending character of a comment required? #' @param doubleEscape Can quoting characters be escaped by doubling them? #' Defaults to `TRUE`. #' @param escape What character can be used to escape quoting characters? #' Defaults to `""`, i.e. nothing. #' @keywords internal #' @export #' @examples #' # Use [] for quoting and no comments #' sqlParseVariablesImpl("[?a]", #' list(sqlQuoteSpec("[", "]", "\\", FALSE)), #' list() #' ) #' #' # Standard quotes, use # for commenting #' sqlParseVariablesImpl("# ?a\n?b", #' list(sqlQuoteSpec("'", "'"), sqlQuoteSpec('"', '"')), #' list(sqlCommentSpec("#", "\n", FALSE)) #' ) setGeneric("sqlParseVariables", def = function(conn, sql, ...) { standardGeneric("sqlParseVariables") }) DBI/R/isSQLKeyword_DBIObject_character.R0000644000176200001440000000052515071142015017353 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL isSQLKeyword_DBIObject_character <- function(dbObj, name, keywords, case, ...) { isSQLKeyword.default(name, keywords, case) } #' @rdname hidden_aliases setMethod( "isSQLKeyword", signature(dbObj = "DBIObject", name = "character"), isSQLKeyword_DBIObject_character, valueClass = "logical" ) DBI/R/dbFetchArrow.R0000644000176200001440000000260115071142015013541 0ustar liggesusers#' Fetch records from a previously executed query as an Arrow object #' #' @description #' `r lifecycle::badge('experimental')` #' #' Fetch the result set and return it as an Arrow object. #' Use [dbFetchArrowChunk()] to fetch results in chunks. #' #' @inheritSection dbBind The data retrieval flow for Arrow streams #' #' @template methods #' @templateVar method_name dbFetchArrow #' #' @inherit DBItest::spec_arrow_fetch_arrow return #' @inheritSection DBItest::spec_arrow_fetch_arrow Failure modes #' @inheritSection DBItest::spec_arrow_fetch_arrow Specification #' #' @param res An object inheriting from [DBI::DBIResultArrow][DBIResultArrow-class], #' created by [dbSendQueryArrow()]. #' @param ... Other arguments passed on to methods. #' @seealso Close the result set with [dbClearResult()] as soon as you #' finish retrieving the records you want. #' @family DBIResultArrow generics #' @family data retrieval generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' #' # Fetch all results #' rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") #' as.data.frame(dbFetchArrow(rs)) #' dbClearResult(rs) #' #' dbDisconnect(con) setGeneric("dbFetchArrow", def = function(res, ...) { standardGeneric("dbFetchArrow") }) DBI/R/dbHasCompleted.R0000644000176200001440000000216115071142015014046 0ustar liggesusers#' Completion status #' #' This method returns if the operation has completed. #' A `SELECT` query is completed if all rows have been fetched. #' A data manipulation statement is always completed. #' #' @inheritSection dbBind The data retrieval flow #' #' @template methods #' @templateVar method_name dbHasCompleted #' #' @inherit DBItest::spec_meta_has_completed return #' @inheritSection DBItest::spec_meta_has_completed Failure modes #' @inheritSection DBItest::spec_meta_has_completed Specification #' #' @inheritParams dbClearResult #' @family DBIResult generics #' @family DBIResultArrow generics #' @family data retrieval generics #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' dbWriteTable(con, "mtcars", mtcars) #' rs <- dbSendQuery(con, "SELECT * FROM mtcars") #' #' dbHasCompleted(rs) #' ret1 <- dbFetch(rs, 10) #' dbHasCompleted(rs) #' ret2 <- dbFetch(rs) #' dbHasCompleted(rs) #' #' dbClearResult(rs) #' dbDisconnect(con) setGeneric( "dbHasCompleted", def = function(res, ...) standardGeneric("dbHasCompleted"), valueClass = "logical" ) DBI/R/25-dbBindArrow.R0000644000176200001440000000017615071142015013615 0ustar liggesusers#' @rdname dbBind #' @export setGeneric("dbBindArrow", def = function(res, params, ...) { standardGeneric("dbBindArrow") }) DBI/R/dbGetQuery_DBIConnection_character.R0000644000176200001440000000063715071142015017763 0ustar liggesusers#' @rdname hidden_aliases #' @param n Number of rows to fetch, default -1 #' @usage NULL dbGetQuery_DBIConnection_character <- function(conn, statement, ..., n = -1L) { rs <- dbSendQuery(conn, statement, ...) on.exit(dbClearResult(rs)) dbFetch(rs, n = n, ...) } #' @rdname hidden_aliases #' @export setMethod( "dbGetQuery", signature("DBIConnection", "character"), dbGetQuery_DBIConnection_character ) DBI/R/dbBindArrow_DBIResultArrowDefault.R0000644000176200001440000000051415071142015017562 0ustar liggesusers#' @rdname hidden_aliases #' @usage NULL dbBindArrow_DBIResultArrowDefault <- function(res, params, ...) { dbBind(res@result, params = param_stream_to_list(params), ...) invisible(res) } #' @rdname hidden_aliases #' @export setMethod( "dbBindArrow", signature("DBIResultArrowDefault"), dbBindArrow_DBIResultArrowDefault ) DBI/R/sqlData.R0000644000176200001440000000206315071142015012562 0ustar liggesusers#' Convert a data frame into form suitable for upload to an SQL database #' #' This is a generic method that coerces R objects into vectors suitable for #' upload to the database. The output will vary a little from method to #' method depending on whether the main upload device is through a single #' SQL string or multiple parameterized queries. #' This method is mostly useful for backend implementers. #' #' The default method: #' #' - Converts factors to characters #' - Quotes all strings with [dbQuoteIdentifier()] #' - Converts all columns to strings with [dbQuoteLiteral()] #' - Replaces NA with NULL #' #' @inheritParams sqlCreateTable #' @inheritParams rownames #' @param value A data frame #' #' @template methods #' @templateVar method_name sqlData #' #' @export #' @examplesIf requireNamespace("RSQLite", quietly = TRUE) #' con <- dbConnect(RSQLite::SQLite(), ":memory:") #' #' sqlData(con, head(iris)) #' sqlData(con, head(mtcars)) #' #' dbDisconnect(con) setGeneric("sqlData", def = function(con, value, row.names = NA, ...) { standardGeneric("sqlData") }) DBI/vignettes/0000755000176200001440000000000015147357131012667 5ustar liggesusersDBI/vignettes/DBI-arrow.Rmd0000644000176200001440000001517214602466070015065 0ustar liggesusers--- title: "Using DBI with Arrow" author: "Kirill Müller" date: "25/12/2023" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Using DBI with Arrow} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} library(knitr) opts_chunk$set(echo = TRUE) knitr::opts_chunk$set(error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5")) knit_print.data.frame <- function(x, ...) { print(head(x, 6)) if (nrow(x) > 6) { cat("Showing 6 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ``` ## Who this tutorial is for This tutorial is for you if you want to leverage [Apache Arrow](https://arrow.apache.org/) for accessing and manipulating data on databases. See `vignette("DBI", package = "DBI")` and `vignette("DBI-advanced", package = "DBI")` for tutorials on accessing data using R's data frames instead of Arrow's structures. ## Rationale Apache Arrow is > a cross-language development platform for in-memory analytics, suitable for large and huge data, with support for out-of-memory operation. Arrow is also a data exchange format, the data types covered by Arrow align well with the data types supported by SQL databases. DBI 1.2.0 introduced support for Arrow as a format for exchanging data between R and databases. The aim is to: - accelerate data retrieval and loading, by using fewer costly data conversions; - better support reading and summarizing data from a database that is larger than memory; - provide better type fidelity with workflows centered around Arrow. This allows existing code to be used with Arrow, and it allows new code to be written that is more efficient and more flexible than code that uses R's data frames. The interface is built around the {nanoarrow} R package, with `nanoarrow::as_nanoarrow_array` and `nanoarrow::as_nanoarrow_array_stream` as fundamental data structures. ## New classes and generics DBI 1.2.0 introduces new classes and generics for working with Arrow data: - `dbReadTableArrow()` - `dbWriteTableArrow()` - `dbCreateTableArrow()` - `dbAppendTableArrow()` - `dbGetQueryArrow()` - `dbSendQueryArrow()` - `dbBindArrow()` - `dbFetchArrow()` - `dbFetchArrowChunk()` - `DBIResultArrow-class` - `DBIResultArrowDefault-class` Compatibility is important for DBI, and implementing new generics and classes greatly reduces the risk of breaking existing code. The DBI package comes with a fully functional fallback implementation for all existing DBI backends. The fallback is not improving performance, but it allows existing code to be used with Arrow before switching to a backend with native Arrow support. Backends with native support, like the [adbi](https://adbi.r-dbi.org/) package, implement the new generics and classes for direct support and improved performance. In the remainder of this tutorial, we will demonstrate the new generics and classes using the RSQLite package. SQLite is an in-memory database, this code does not need a database server to be installed and running. ## Prepare We start by setting up a database connection and creating a table with some data, using the original `dbWriteTable()` method. ```{r} library(DBI) con <- dbConnect(RSQLite::SQLite()) data <- data.frame( a = 1:3, b = 4.5, c = "five" ) dbWriteTable(con, "tbl", data) ``` ## Read all rows from a table The `dbReadTableArrow()` method reads all rows from a table into an Arrow stream, similarly to `dbReadTable()`. Arrow objects implement the `as.data.frame()` method, so we can convert the stream to a data frame. ```{r} stream <- dbReadTableArrow(con, "tbl") stream as.data.frame(stream) ``` ## Run queries The `dbGetQueryArrow()` method runs a query and returns the result as an Arrow stream. This stream can be turned into an `arrow::RecordBatchReader` object and processed further, without bringing it into R. ```{r} stream <- dbGetQueryArrow(con, "SELECT COUNT(*) AS n FROM tbl WHERE a < 3") stream path <- tempfile(fileext = ".parquet") arrow::write_parquet(arrow::as_record_batch_reader(stream), path) arrow::read_parquet(path) ``` ## Prepared queries The `dbGetQueryArrow()` method supports prepared queries, using the `params` argument which accepts a data frame or a list. ```{r} params <- data.frame(a = 3L) stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) params <- data.frame(a = c(2L, 4L)) # Equivalent to dbBind() stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) ``` ## Manual flow For the manual flow, use `dbSendQueryArrow()` to send a query to the database, and `dbFetchArrow()` to fetch the result. This also allows using the new `dbBindArrow()` method to bind data in Arrow format to a prepared query. Result objects must be cleared with `dbClearResult()`. ```{r} rs <- dbSendQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a") in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 2L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 3L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1:4L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) dbClearResult(rs) ``` ## Writing data Streams returned by `dbGetQueryArrow()` and `dbReadTableArrow()` can be written to a table using `dbWriteTableArrow()`. ```{r} stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbWriteTableArrow(con, "tbl_new", stream) dbReadTable(con, "tbl_new") ``` ## Appending data For more control over the writing process, use `dbCreateTableArrow()` and `dbAppendTableArrow()`. ```{r} stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbCreateTableArrow(con, "tbl_split", stream) dbAppendTableArrow(con, "tbl_split", stream) stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a >= 3") dbAppendTableArrow(con, "tbl_split", stream) dbReadTable(con, "tbl_split") ``` ## Conclusion Do not forget to disconnect from the database when done. ```{r} dbDisconnect(con) ``` That concludes the major features of DBI's new Arrow interface. For more details on the library functions covered in this tutorial see the DBI specification at `vignette("spec", package = "DBI")`. See the [adbi](https://adbi.r-dbi.org/) package for a backend with native Arrow support, and [nanoarrow](https://github.com/apache/arrow-nanoarrow) and [arrow](https://arrow.apache.org/docs/r/) for packages to work with the Arrow format. DBI/vignettes/DBI-1.Rmd0000644000176200001440000006004715144403222014064 0ustar liggesusers--- title: "A Common Database Interface (DBI)" author: "R-Databases Special Interest Group" date: "16 June 2003" output: rmarkdown::html_vignette bibliography: biblio.bib vignette: > %\VignetteIndexEntry{A Common Database Interface (DBI)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- This document describes a common interface between the S language (in its R and S-Plus implementations) and database management systems (DBMS). The interface defines a small set of classes and methods similar in spirit to Perl’s DBI, Java’s JDBC, Python’s DB-API, and Microsoft’s ODBC. # Version {#sec:version} This document describes version 0.1-6 of the database interface API (application programming interface). # Introduction {#sec:intro} The database interface (DBI) separates the connectivity to the DBMS into a “front-end� and a “back-end�. Applications use only the exposed “front-end� API. The facilities that communicate with specific DBMS (Oracle, PostgreSQL, etc.) are provided by “device drivers� that get invoked automatically by the S language evaluator. The following example illustrates some of the DBI capabilities: ```R ## Choose the proper DBMS driver and connect to the server drv <- dbDriver("ODBC") con <- dbConnect(drv, "dsn", "usr", "pwd") ## The interface can work at a higher level importing tables ## as data.frames and exporting data.frames as DBMS tables. dbListTables(con) dbListFields(con, "quakes") if(dbExistsTable(con, "new_results")) dbRemoveTable(con, "new_results") dbWriteTable(con, "new_results", new.output) ## The interface allows lower-level interface to the DBMS res <- dbSendQuery(con, paste( "SELECT g.id, g.mirror, g.diam, e.voltage", "FROM geom_table as g, elec_measures as e", "WHERE g.id = e.id and g.mirrortype = 'inside'", "ORDER BY g.diam")) out <- NULL while(!dbHasCompleted(res)){ chunk <- fetch(res, n = 10000) out <- c(out, doit(chunk)) } ## Free up resources dbClearResult(res) dbDisconnect(con) dbUnloadDriver(drv) ``` (only the first 2 expressions are DBMS-specific – all others are independent of the database engine itself). Individual DBI drivers need not implement all the features we list below (we indicate those that are optional). Furthermore, drivers may extend the core DBI facilities, but we suggest to have these extensions clearly indicated and documented. The following are the elements of the DBI: 1. A set of classes and methods (Section [sec:DBIClasses]) that defines what operations are possible and how they are defined, e.g.: - connect/disconnect to the DBMS - create and execute statements in the DBMS - extract results/output from statements - error/exception handling - information (meta-data) from database objects - transaction management (optional) Some things are left explicitly unspecified, e.g., authentication and even the query language, although it is hard to avoid references to SQL and relational database management systems (RDBMS). 2. Drivers Drivers are collection of functions that implement the functionality defined above in the context of specific DBMS, e.g., mSQL, Informix. 3. Data type mappings (Section [sec:data-mappings].) Mappings and conversions between DBMS data types and R/S objects. All drivers should implement the “basic� primitives (see below), but may chose to add user-defined conversion function to handle more generic objects (e.g., factors, ordered factors, time series, arrays, images). 4. Utilities (Section [sec:utilities].) These facilities help with details such as mapping of identifiers between S and DBMS (e.g., `_` is illegal in R/S names, and `.` is used for constructing compound SQL identifiers), etc. # DBI Classes and Methods {#sec:DBIClasses} The following are the main DBI classes. They need to be extended by individual database back-ends (Sybase, Oracle, etc.) Individual drivers need to provide methods for the generic functions listed here (those methods that are optional are so indicated). *Note: Although R releases prior to 1.4 do not have a formal concept of classes, we will use the syntax of the S Version 4 classes and methods (available in R releases 1.4 and later as library `methods`) to convey precisely the DBI class hierarchy, its methods, and intended behavior.* The DBI classes are `DBIObject`, `DBIDriver`, `DBIConnection` and `DBIResult`. All these are *virtual* classes. Drivers define new classes that extend these, e.g., `PgSQLDriver`, `PgSQLConnection`, and so on. ![Class hierarchy for the DBI. The top two layers are comprised of virtual classes and each lower layer represents a set of driver-specific implementation classes that provide the functionality defined by the virtual classes above.](hierarchy.png) `DBIObject`: : Virtual class[^1] that groups all other DBI classes. `DBIDriver`: : Virtual class that groups all DBMS drivers. Each DBMS driver extends this class. Typically generator functions instantiate the actual driver objects, e.g., `PgSQL`, `HDF5`, `BerkeleyDB`. `DBIConnection`: : Virtual class that encapsulates connections to DBMS. `DBIResult`: : Virtual class that describes the result of a DBMS query or statement. [Q: Should we distinguish between a simple result of DBMS statements e.g., as `delete` from DBMS queries (i.e., those that generate data).] The methods `format`, `print`, `show`, `dbGetInfo`, and `summary` are defined (and *implemented* in the `DBI` package) for the `DBIObject` base class, thus available to all implementations; individual drivers, however, are free to override them as they see fit. `format(x, ...)`: : produces a concise character representation (label) for the `DBIObject` `x`. `print(x, ...)`/`show(x)`: : prints a one-line identification of the object `x`. `summary(object, ...)`: : produces a concise description of the object. The default method for `DBIObject` simply invokes `dbGetInfo(dbObj)` and prints the name-value pairs one per line. Individual implementations may tailor this appropriately. `dbGetInfo(dbObj, ...)`: : extracts information (meta-data) relevant for the `DBIObject` `dbObj`. It may return a list of key/value pairs, individual meta-data if supplied in the call, or `NULL` if the requested meta-data is not available. *Hint:* Driver implementations may choose to allow an argument `what` to specify individual meta-data, e.g., `dbGetInfo(drv, what = max.connections)`. In the next few sub-sections we describe in detail each of these classes and their methods. ## Class `DBIObject` {#sec:DBIObject} This class simply groups all DBI classes, and thus all extend it. ## Class `DBIDriver` {#sec:DBIDriver} This class identifies the database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The DBI provides the generator `dbDriver(driverName)` which simply invokes the function `driverName`, which in turn instantiates the corresponding driver object. The `DBIDriver` class defines the following methods: `driverName`: : [meth:driverName] initializes the driver code. The name `driverName` refers to the actual generator function for the DBMS, e.g., `RPgSQL`, `RODBC`, `HDF5`. The driver instance object is used with `dbConnect` (see page ) for opening one or possibly more connections to one or more DBMS. `dbListConnections(drv, ...)`: : list of current connections being handled by the `drv` driver. May be `NULL` if there are no open connections. Drivers that do not support multiple connections may return the one open connection. `dbGetInfo(dbObj, ...)`: : returns a list of name-value pairs of information about the driver. *Hint:* Useful entries could include `name`: : the driver name (e.g., `RODBC`, `RPgSQL`); `driver.version`: : version of the driver; `DBI.version`: : the version of the DBI that the driver implements, e.g., `0.1-2`; `client.version`: : of the client DBMS libraries (e.g., version of the `libpq` library in the case of `RPgSQL`); `max.connections`: : maximum number of simultaneous connections; plus any other relevant information about the implementation, for instance, how the driver handles upper/lower case in identifiers. `dbUnloadDriver(driverName)` (optional): : frees all resources (local and remote) used by the driver. Returns a logical to indicate if it succeeded or not. ## Class `DBIConnection` {#sec:DBIConnection} This virtual class encapsulates the connection to a DBMS, and it provides access to dynamic queries, result sets, DBMS session management (transactions), etc. *Note:* Individual drivers are free to implement single or multiple simultaneous connections. The methods defined by the `DBIConnection` class include: `dbConnect(drv, ...)`: : [meth:dbConnect] creates and opens a connection to the database implemented by the driver `drv` (see Section [sec:DBIDriver]). Each driver will define what other arguments are required, e.g., `dbname` or `dsn` for the database name, `user`, and `password`. It returns an object that extends `DBIConnection` in a driver-specific manner (e.g., the MySQL implementation could create an object of class `MySQLConnection` that extends `DBIConnection`). `dbDisconnect(conn, ...)`: : closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). Returns a logical indicating whether it succeeded or not. `dbSendQuery(conn, statement, ...)`: : submits one statement to the DBMS. It returns a `DBIResult` object. This object is needed for fetching data in case the statement generates output (see `fetch` on page ), and it may be used for querying the state of the operation; see `dbGetInfo` and other meta-data methods on page . `dbGetQuery(conn, statement, ...)`: : submit, execute, and extract output in one operation. The resulting object may be a `data.frame` if the `statement` generates output. Otherwise the return value should be a logical indicating whether the query succeeded or not. `dbGetException(conn, ...)`: : returns a list with elements `errNum` and `errMsg` with the status of the last DBMS statement sent on a given connection (this information may also be provided by the `dbGetInfo` meta-data function on the `conn` object. *Hint:* The ANSI SQL-92 defines both a status code and an status message that could be return as members of the list. `dbGetInfo(dbObj, ...)`: : returns a list of name-value pairs describing the state of the connection; it may return one or more meta-data, the actual driver method allows to specify individual pieces of meta-data (e.g., maximum number of open results/cursors). *Hint:* Useful entries could include `dbname`: : the name of the database in use; `db.version`: : the DBMS server version (e.g., “Oracle 8.1.7 on Solaris�; `host`: : host where the database server resides; `user`: : user name; `password`: : password (is this safe?); plus any other arguments related to the connection (e.g., thread id, socket or TCP connection type). `dbListResults(conn, ...)`: : list of `DBIResult` objects currently active on the connection `conn`. May be `NULL` if no result set is active on `conn`. Drivers that implement only one result set per connection could return that one object (no need to wrap it in a list). *Note: The following are convenience methods that simplify the import/export of (mainly) data.frames. The first five methods implement the core methods needed to `attach` remote DBMS to the S search path. (For details, see @data-management:1991 [@database-classes:1999].)* *Hint:* For relational DBMS these methods may be easily implemented using the core DBI methods `dbConnect`, `dbSendQuery`, and `fetch`, due to SQL reflectance (i.e., one easily gets this meta-data by querying the appropriate tables on the RDBMS). `dbListTables(conn, ...)`: : returns a character vector (possibly of zero-length) of object (table) names available on the `conn` connection. `dbReadTable(conn, name, ...)`: : imports the data stored remotely in the table `name` on connection `conn`. Use the field `row.names` as the `row.names` attribute of the output data.frame. Returns a `data.frame`. [Q: should we spell out how row.names should be created? E.g., use a field (with unique values) as row.names? Also, should `dbReadTable` reproduce a data.frame exported with `dbWriteTable`?] `dbWriteTable(conn, name, value, ...)`: : write the object `value` (perhaps after coercing it to data.frame) into the remote object `name` in connection `conn`. Returns a logical indicating whether the operation succeeded or not. `dbExistsTable(conn, name, ...)`: : does remote object `name` exist on `conn`? Returns a logical. `dbRemoveTable(conn, name, ...)`: : removes remote object `name` on connection `conn`. Returns a logical indicating whether the operation succeeded or not. `dbListFields(conn, name, ...)`: : returns a character vector listing the field names of the remote table `name` on connection `conn` (see `dbColumnInfo()` for extracting data type on a table). *Note: The following methods deal with transactions and stored procedures. All these functions are optional.* `dbCommit(conn, ...)`(optional): : commits pending transaction on the connection and returns `TRUE` or `FALSE` depending on whether the operation succeeded or not. `dbRollback(conn, ...)`(optional): : undoes current transaction on the connection and returns `TRUE` or `FALSE` depending on whether the operation succeeded or not. `dbCallProc(conn, storedProc, ...)`(optional): : invokes a stored procedure in the DBMS and returns a `DBIResult` object. [Stored procedures are *not* part of the ANSI SQL-92 standard and vary substantially from one RDBMS to another.] **Deprecated since 2014:** The recommended way of calling a stored procedure is now - `dbGetQuery` if a result set is returned and - `dbExecute` for data manipulation and other cases that do not return a result set. ## Class `DBIResult` {#sec:DBIResult} This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query). The result set `res` keeps track of whether the statement produces output for R/S, how many rows were affected by the operation, how many rows have been fetched (if statement is a query), whether there are more rows to fetch, etc. *Note: Individual drivers are free to allow single or multiple active results per connection.* [Q: Should we distinguish between results that return no data from those that return data?] The class `DBIResult` defines the following methods: `fetch(res, n, ...)`: : [meth:fetch] fetches the next `n` elements (rows) from the result set `res` and return them as a data.frame. A value of `n=-1` is interpreted as “return all elements/rows�. `dbClearResult(res, ...)`: : flushes any pending data and frees all resources (local and remote) used by the object `res` on both sides of the connection. Returns a logical indicating success or not. `dbGetInfo(dbObj, ...)`: : returns a name-value list with the state of the result set. *Hint:* Useful entries could include `statement`: : a character string representation of the statement being executed; `rows.affected`: : number of affected records (changed, deleted, inserted, or extracted); `row.count`: : number of rows fetched so far; `has.completed`: : has the statement (query) finished? `is.select`: : a logical describing whether or not the statement generates output; plus any other relevant driver-specific meta-data. `dbColumnInfo(res, ...)`: : produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame should describe an aspect of the result set field (field name, type, etc.) *Hint:* The data.frame columns could include `field.name`: : DBMS field label; `field.type`: : DBMS field type (implementation-specific); `data.type`: : corresponding R/S data type, e.g., `integer`; `precision`/`scale`: : (as in ODBC terminology), display width and number of decimal digits, respectively; `nullable`: : whether the corresponding field may contain (DBMS) `NULL` values; plus other driver-specific information. `dbSetDataMappings(flds, ...)`(optional): : defines a conversion between internal DBMS data types and R/S classes. We expect the default mappings (see Section [sec:data-mappings]) to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. [This topic needs further discussion.] *Note: The following are convenience methods that extract information from the result object (they may be implemented by invoking `dbGetInfo` with appropriate arguments).* `dbGetStatement(res, ...)`(optional): : returns the DBMS statement (as a character string) associated with the result `res`. `dbGetRowsAffected(res, ...)`(optional): : returns the number of rows affected by the executed statement (number of records deleted, modified, extracted, etc.) `dbHasCompleted(res, ...)`(optional): : returns a logical that indicates whether the operation has been completed (e.g., are there more records to be fetched?). `dbGetRowCount(res, ...)`(optional): : returns the number of rows fetched so far. # Data Type Mappings {#sec:data-mappings} The data types supported by databases are different than the data types in R and S, but the mapping between the “primitive� types is straightforward: Any of the many fixed and varying length character types are mapped to R/S `character`. Fixed-precision (non-IEEE) numbers are mapped into either doubles (`numeric`) or long (`integer`). Notice that many DBMS do not follow the so-called IEEE arithmetic, so there are potential problems with under/overflows and loss of precision, but given the R/S primitive types we cannot do too much but identify these situations and warn the application (how?). By default dates and date-time objects are mapped to character using the appropriate `TO_CHAR` function in the DBMS (which should take care of any locale information). Some RDBMS support the type `CURRENCY` or `MONEY` which should be mapped to `numeric` (again with potential round off errors). Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion (as has been done in other inter-systems packages [^2]). Specifying user-defined conversion functions still needs to be defined. # Utilities {#sec:utilities} The core DBI implementation should make available to all drivers some common basic utilities. For instance: `dbGetDBIVersion`: : returns the version of the currently attached DBI as a string. `dbDataType(dbObj, obj, ...)`: : returns a string with the (approximately) appropriate data type for the R/S object `obj`. The DBI can implement this following the ANSI-92 standard, but individual drivers may want/need to extend it to make use of DBMS-specific types. `make.db.names(dbObj, snames, ...)`: : maps R/S names (identifiers) to SQL identifiers replacing illegal characters (as `.`) by the legal SQL `_`. `SQLKeywords(dbObj, ...)`: : returns a character vector of SQL keywords (reserved words). The default method returns the list of `.SQL92Keywords`, but drivers should update this vector with the DBMS-specific additional reserved words. `isSQLKeyword(dbObj, name, ...)`: : for each element in the character vector `name` determine whether or not it is an SQL keyword, as reported by the generic function `SQLKeywords`. Returns a logical vector parallel to the input object `name`. # Open Issues and Limitations {#sec:open-issues} There are a number of issues and limitations that the current DBI conscientiously does not address on the interest of simplicity. We do list here the most important ones. Non-SQL: : Is it realistic to attempt to encompass non-relational databases, like HDF5, Berkeley DB, etc.? Security: : allowing users to specify their passwords on R/S scripts may be unacceptable for some applications. We need to consider alternatives where users could store authentication on files (perhaps similar to ODBC’s `odbc.ini`) with more stringent permissions. Exceptions: : the exception mechanism is a bit too simple, and it does not provide for information when problems stem from the DBMS interface itself. For instance, under/overflow or loss of precision as we move numeric data from DBMS to the more limited primitives in R/S. Asynchronous communication: : most DBMS support both synchronous and asynchronous communications, allowing applications to submit a query and proceed while the database server process the query. The application is then notified (or it may need to poll the server) when the query has completed. For large computations, this could be very useful, but the DBI would need to specify how to interrupt the server (if necessary) plus other details. Also, some DBMS require applications to use threads to implement asynchronous communication, something that neither R nor S-Plus currently addresses. SQL scripts: : the DBI only defines how to execute one SQL statement at a time, forcing users to split SQL scripts into individual statements. We need a mechanism by which users can submit SQL scripts that could possibly generate multiple result sets; in this case we may need to introduce new methods to loop over multiple results (similar to Python’s `nextResultSet`). BLOBS/CLOBS: : large objects (both character and binary) present some challenges both to R and S-Plus. It is becoming more common to store images, sounds, and other data types as binary objects in DBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects. Transactions: : transaction management is not fully described. Additional methods: : Do we need any additional methods? (e.g., `dbListDatabases(conn)`, `dbListTableIndices(conn, name)`, how do we list all available drivers?) Bind variables: : the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variables�; this is a mechanism by which the contents of R/S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement /* SQL */ SELECT * from emp_table where emp_id = :sampleEmployee would take the vector `sampleEmployee` and iterate over each of its elements to get the result. Perhaps the DBI could at some point in the future implement this feature. # Resources {#sec:resources} The idea of a common interface to databases has been successfully implemented in various environments, for instance: Java’s Database Connectivity (JDBC) ([www.javasoft.com](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/)). In C through the Open Database Connectivity (ODBC) ([www.unixodbc.org](https://www.unixodbc.org/)). Python’s Database Application Programming Interface ([www.python.org](https://wiki.python.org/python/DatabaseProgramming.html)). Perl’s Database Interface ([dbi.perl.org](https://dbi.perl.org)). [^1]: A virtual class allows us to group classes that share some common characteristics, even if their implementations are radically different. [^2]: Duncan Temple Lang has volunteered to port the data conversion code found in R-Java, R-Perl, and R-Python packages to the DBI DBI/vignettes/spec.md0000644000176200001440000045675615144400600014155 0ustar liggesusers## DBI: R Database Interface DBI defines an interface for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations (so-called *DBI backends*). ### Definition A DBI backend is an R package which imports the DBI and methods packages. For better or worse, the names of many existing backends start with ‘R’, e.g., RSQLite, RMySQL, RSQLServer; it is up to the backend author to adopt this convention or not. ### DBI classes and methods A backend defines three classes, which are subclasses of DBIDriver, DBIConnection, and DBIResult. The backend provides implementation for all methods of these base classes that are defined but not implemented by DBI. All methods defined in DBI are reexported (so that the package can be used without having to attach DBI), and have an ellipsis `...` in their formals for extensibility. ### Construction of the DBIDriver object The backend must support creation of an instance of its DBIDriver subclass with a constructor function. By default, its name is the package name without the leading ‘R’ (if it exists), e.g., `SQLite` for the RSQLite package. However, backend authors may choose a different name. The constructor must be exported, and it must be a function that is callable without arguments. DBI recommends to define a constructor with an empty argument list. ### Examples ``` r RSQLite::SQLite() ``` ## Determine the SQL data type of an object This section describes the behavior of the following method: ``` r dbDataType(dbObj, obj, ...) ``` ### Description Returns an SQL string that describes the SQL data type to be used for an object. The default implementation of this generic determines the SQL type of an R object according to the SQL 92 specification, which may serve as a starting point for driver implementations. DBI also provides an implementation for data.frame which will return a character vector giving the type for each column in the dataframe. ### Arguments | | | |---------|-----------------------------------------------------| | `dbObj` | A object inheriting from DBIDriver or DBIConnection | | `obj` | An R object whose SQL type we want to determine. | | `...` | Other arguments passed on to methods. | ### Details The data types supported by databases are different than the data types in R, but the mapping between the primitive types is straightforward: - Any of the many fixed and varying length character types are mapped to character vectors - Fixed-precision (non-IEEE) numbers are mapped into either numeric or integer vectors. Notice that many DBMS do not follow IEEE arithmetic, so there are potential problems with under/overflows and loss of precision. ### Value `dbDataType()` returns the SQL type that corresponds to the `obj` argument as a non-empty character string. For data frames, a character vector with one element per column is returned. ### Failure modes An error is raised for invalid values for the `obj` argument such as a `NULL` value. ### Specification The backend can override the `dbDataType()` generic for its driver class. This generic expects an arbitrary object as second argument. To query the values returned by the default implementation, run `example(dbDataType, package = "DBI")`. If the backend needs to override this generic, it must accept all basic R data types as its second argument, namely logical, integer, numeric, character, dates (see Dates), date-time (see DateTimeClasses), and difftime. If the database supports blobs, this method also must accept lists of raw vectors, and blob::blob objects. As-is objects (i.e., wrapped by `I()`) must be supported and return the same results as their unwrapped counterparts. The SQL data type for factor and ordered is the same as for character. The behavior for other object types is not specified. All data types returned by `dbDataType()` are usable in an SQL statement of the form `"CREATE TABLE test (a ...)"`. ### Examples ``` r dbDataType(ANSI(), 1:5) dbDataType(ANSI(), 1) dbDataType(ANSI(), TRUE) dbDataType(ANSI(), Sys.Date()) dbDataType(ANSI(), Sys.time()) dbDataType(ANSI(), Sys.time() - as.POSIXct(Sys.Date())) dbDataType(ANSI(), c("x", "abc")) dbDataType(ANSI(), list(raw(10), raw(20))) dbDataType(ANSI(), I(3)) dbDataType(ANSI(), iris) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbDataType(con, 1:5) dbDataType(con, 1) dbDataType(con, TRUE) dbDataType(con, Sys.Date()) dbDataType(con, Sys.time()) dbDataType(con, Sys.time() - as.POSIXct(Sys.Date())) dbDataType(con, c("x", "abc")) dbDataType(con, list(raw(10), raw(20))) dbDataType(con, I(3)) dbDataType(con, iris) dbDisconnect(con) ``` ## Create a connection to a DBMS This section describes the behavior of the following method: ``` r dbConnect(drv, ...) ``` ### Description Connect to a DBMS going through the appropriate authentication procedure. Some implementations may allow you to have multiple connections open, so you may invoke this function repeatedly assigning its output to different objects. The authentication mechanism is left unspecified, so check the documentation of individual drivers for details. Use `dbCanConnect()` to check if a connection can be established. ### Arguments | | | |----|----| | `drv` | An object that inherits from DBIDriver, or an existing DBIConnection object (in order to clone an existing connection). | | `...` | Authentication arguments needed by the DBMS instance; these typically include `user`, `password`, `host`, `port`, `dbname`, etc. For details see the appropriate `DBIDriver`. | ### Value `dbConnect()` returns an S4 object that inherits from DBIConnection. This object is used to communicate with the database engine. A `format()` method is defined for the connection object. It returns a string that consists of a single line of text. ### Specification DBI recommends using the following argument names for authentication parameters, with `NULL` default: - `user` for the user name (default: current user) - `password` for the password - `host` for the host name (default: local connection) - `port` for the port number (default: local connection) - `dbname` for the name of the database on the host, or the database file name The defaults should provide reasonable behavior, in particular a local connection for `host = NULL`. For some DBMS (e.g., PostgreSQL), this is different to a TCP/IP connection to `localhost`. In addition, DBI supports the `bigint` argument that governs how 64-bit integer data is returned. The following values are supported: - `"integer"`: always return as `integer`, silently overflow - `"numeric"`: always return as `numeric`, silently round - `"character"`: always return the decimal representation as `character` - `"integer64"`: return as a data type that can be coerced using `as.integer()` (with warning on overflow), `as.numeric()` and `as.character()` ### Examples ``` r # SQLite only needs a path to the database. (Here, ":memory:" is a special # path that creates an in-memory database.) Other database drivers # will require more details (like user, password, host, port, etc.) con <- dbConnect(RSQLite::SQLite(), ":memory:") con dbListTables(con) dbDisconnect(con) # Bad, for subtle reasons: # This code fails when RSQLite isn't loaded yet, # because dbConnect() doesn't know yet about RSQLite. dbListTables(con <- dbConnect(RSQLite::SQLite(), ":memory:")) ``` ## Disconnect (close) a connection This section describes the behavior of the following method: ``` r dbDisconnect(conn, ...) ``` ### Description This closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `...` | Other parameters passed on to methods. | ### Value `dbDisconnect()` returns `TRUE`, invisibly. ### Failure modes A warning is issued on garbage collection when a connection has been released without calling `dbDisconnect()`, but this cannot be tested automatically. At least one warning is issued immediately when calling `dbDisconnect()` on an already disconnected or invalid connection. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbDisconnect(con) ``` ## Execute a query on a given database connection This section describes the behavior of the following method: ``` r dbSendQuery(conn, statement, ...) ``` ### Description The `dbSendQuery()` method only submits and synchronously executes the SQL query to the database engine. It does *not* extract any records — for that you need to use the `dbFetch()` method, and then you must call `dbClearResult()` when you finish fetching the records you need. For interactive use, you should almost always prefer `dbGetQuery()`. Use `dbSendQueryArrow()` or `dbGetQueryArrow()` instead to retrieve the results as an Arrow object. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbSendQuery()` generic (to improve compatibility across backends) but are part of the DBI specification: - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" sections for details on their usage. ### Specification No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to `dbClearResult()`. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with `dbClearResult()`. The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details This method is for `SELECT` queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use `dbSendStatement()` for data manipulation statements. The query is submitted to the database server and the DBMS executes it, possibly generating vast amounts of data. Where these data live is driver-specific: some drivers may choose to leave the output on the server and transfer them piecemeal to R, others may transfer all the data to the client – but not necessarily to the memory that R manages. See individual drivers' `dbSendQuery()` documentation for details. ### Value `dbSendQuery()` returns an S4 object that inherits from DBIResult. The result set can be used with `dbFetch()` to extract records. Once you have finished using a result, make sure to clear it with `dbClearResult()`. ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-`NA` string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the `params` argument) or the `immediate` argument is set to `TRUE`. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(rs) dbClearResult(rs) # Pass one set of values with the param argument: rs <- dbSendQuery( con, "SELECT * FROM mtcars WHERE cyl = ?", params = list(4L) ) dbFetch(rs) dbClearResult(rs) # Pass multiple sets of values with dbBind(): rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = ?") dbBind(rs, list(6L)) dbFetch(rs) dbBind(rs, list(8L)) dbFetch(rs) dbClearResult(rs) dbDisconnect(con) ``` ## Fetch records from a previously executed query This section describes the behavior of the following methods: ``` r dbFetch(res, n = -1, ...) fetch(res, n = -1, ...) ``` ### Description Fetch the next `n` elements (rows) from the result set and return them as a data.frame. ### Arguments | | | |----|----| | `res` | An object inheriting from DBIResult, created by `dbSendQuery()`. | | `n` | maximum number of records to retrieve per fetch. Use `n = -1` or `n = Inf` to retrieve all pending records. Some implementations may recognize other special values. | | `...` | Other arguments passed on to methods. | ### Details `fetch()` is provided for compatibility with older DBI clients - for all new code you are strongly encouraged to use `dbFetch()`. The default implementation for `dbFetch()` calls `fetch()` so that it is compatible with existing code. Modern backends should implement for `dbFetch()` only. ### Value `dbFetch()` always returns a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. Passing `n = NA` is supported and returns an arbitrary number of rows (at least one) as specified by the driver, but at most the remaining rows in the result set. ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An attempt to fetch from a closed result set raises an error. If the `n` argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to `dbFetch()` with proper `n` argument succeeds. Calling `dbFetch()` on a result set from a data manipulation query created by `dbSendStatement()` can be fetched and return an empty data frame, with a warning. ### Specification Fetching multi-row queries with one or more columns by default returns the entire result. Multi-row queries can also be fetched progressively by passing a whole number (integer or numeric) as the `n` argument. A value of Inf for the `n` argument is supported and also returns the full result. If more rows than available are fetched, the result is returned in full without warning. If fewer rows than requested are returned, further fetches will return a data frame with zero rows. If zero rows are fetched, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued when clearing the result set. A column named `row_names` is treated like any other column. The column types of the returned data frame depend on the data returned: - integer (or coercible to an integer) for integer values between -2^31 and 2^31 - 1, with NA for SQL `NULL` values - numeric for numbers with a fractional component, with NA for SQL `NULL` values - logical for Boolean values (some backends may return an integer); with NA for SQL `NULL` values - character for text, with NA for SQL `NULL` values - lists of raw for blobs with NULL entries for SQL NULL values - coercible using `as.Date()` for dates, with NA for SQL `NULL` values (also applies to the return value of the SQL function `current_date`) - coercible using `hms::as_hms()` for times, with NA for SQL `NULL` values (also applies to the return value of the SQL function `current_time`) - coercible using `as.POSIXct()` for timestamps, with NA for SQL `NULL` values (also applies to the return value of the SQL function `current_timestamp`) If dates and timestamps are supported by the backend, the following R types are used: - Date for dates (also applies to the return value of the SQL function `current_date`) - POSIXct for timestamps (also applies to the return value of the SQL function `current_timestamp`) R has no built-in type with lossless support for the full range of 64-bit or larger integers. If 64-bit integers are returned from a query, the following rules apply: - Values are returned in a container with support for the full range of valid 64-bit values (such as the `integer64` class of the bit64 package) - Coercion to numeric always returns a number that is as close as possible to the true value - Loss of precision when converting to numeric gives a warning - Conversion to character always returns a lossless decimal representation of the data ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(rs) dbClearResult(rs) # Fetch in chunks rs <- dbSendQuery(con, "SELECT * FROM mtcars") while (!dbHasCompleted(rs)) { chunk <- dbFetch(rs, 10) print(nrow(chunk)) } dbClearResult(rs) dbDisconnect(con) ``` ## Clear a result set This section describes the behavior of the following method: ``` r dbClearResult(res, ...) ``` ### Description Frees all resources (local and remote) associated with a result set. This step is mandatory for all objects obtained by calling `dbSendQuery()` or `dbSendStatement()`. ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbClearResult()` returns `TRUE`, invisibly, for result sets obtained from `dbSendQuery()`, `dbSendStatement()`, or `dbSendQueryArrow()`, ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### The command execution flow This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of `dbBindArrow()`, is implemented by `dbExecute()`, which should be sufficient for non-parameterized queries. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendStatement()` to create a result set object of class DBIResult. For some queries you need to pass `immediate = TRUE`. 2. Optionally, bind query parameters with`dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbGetRowsAffected()` to retrieve the number of rows affected by the query. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An attempt to close an already closed result set issues a warning for `dbSendQuery()`, `dbSendStatement()`, and `dbSendQueryArrow()`, ### Specification `dbClearResult()` frees all resources associated with retrieving the result of a query or update operation. The DBI backend can expect a call to `dbClearResult()` for each `dbSendQuery()` or `dbSendStatement()` call. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") rs <- dbSendQuery(con, "SELECT 1") print(dbFetch(rs)) dbClearResult(rs) dbDisconnect(con) ``` ## Bind values to a parameterized/prepared statement This section describes the behavior of the following methods: ``` r dbBind(res, params, ...) dbBindArrow(res, params, ...) ``` ### Description For parametrized or prepared statements, the `dbSendQuery()`, `dbSendQueryArrow()`, and `dbSendStatement()` functions can be called with statements that contain placeholders for values. The `dbBind()` and `dbBindArrow()` functions bind these placeholders to actual values, and are intended to be called on the result set before calling `dbFetch()` or `dbFetchArrow()`. The values are passed to `dbBind()` as lists or data frames, and to `dbBindArrow()` as a stream created by `nanoarrow::as_nanoarrow_array_stream()`. [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) `dbBindArrow()` is experimental, as are the other `�*Arrow�` functions. `dbSendQuery()` is compatible with `dbBindArrow()`, and `dbSendQueryArrow()` is compatible with `dbBind()`. ### Arguments | | | |----|----| | `res` | An object inheriting from DBIResult. | | `params` | For `dbBind()`, a list of values, named or unnamed, or a data frame, with one element/column per query parameter. For `dbBindArrow()`, values as a nanoarrow stream, with one column per query parameter. | | `...` | Other arguments passed on to methods. | ### Details DBI supports parametrized (or prepared) queries and statements via the `dbBind()` and `dbBindArrow()` generics. Parametrized queries are different from normal queries in that they allow an arbitrary number of placeholders, which are later substituted by actual values. Parametrized queries (and statements) serve two purposes: - The same query can be executed more than once with different values. The DBMS may cache intermediate information for the query, such as the execution plan, and execute it faster. - Separation of query syntax and parameters protects against SQL injection. The placeholder format is currently not specified by DBI; in the future, a uniform placeholder syntax may be supported. Consult the backend documentation for the supported formats. For automated testing, backend authors specify the placeholder syntax with the `placeholder_pattern` tweak. Known examples are: - `�?�` (positional matching in order of appearance) in RMariaDB and RSQLite - `�\$1�` (positional matching by index) in RPostgres and RSQLite - `�:name�` and `�\$name�` (named matching) in RSQLite ### Value `dbBind()` returns the result set, invisibly, for queries issued by `dbSendQuery()` or `dbSendQueryArrow()` and also for data manipulation statements issued by `dbSendStatement()`. ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### The data retrieval flow for Arrow streams This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of `dbBindArrow()` or `dbBind()`, is implemented by `dbGetQueryArrow()`, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQueryArrow()` to create a result set object of class DBIResultArrow. 2. Optionally, bind query parameters with `dbBindArrow()` or `dbBind()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Use `dbFetchArrow()` to get a data stream. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### The command execution flow This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of `dbBindArrow()`, is implemented by `dbExecute()`, which should be sufficient for non-parameterized queries. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendStatement()` to create a result set object of class DBIResult. For some queries you need to pass `immediate = TRUE`. 2. Optionally, bind query parameters with`dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbGetRowsAffected()` to retrieve the number of rows affected by the query. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes Calling `dbBind()` for a query without parameters raises an error. Binding too many or not enough values, or parameters with wrong names or unequal length, also raises an error. If the placeholders in the query are named, all parameter values must have names (which must not be empty or `NA`), and vice versa, otherwise an error is raised. The behavior for mixing placeholders of different types (in particular mixing positional and named placeholders) is not specified. Calling `dbBind()` on a result set already cleared by `dbClearResult()` also raises an error. ### Specification DBI clients execute parametrized statements as follows: 1. Call `dbSendQuery()`, `dbSendQueryArrow()` or `dbSendStatement()` with a query or statement that contains placeholders, store the returned DBIResult object in a variable. Mixing placeholders (in particular, named and unnamed ones) is not recommended. It is good practice to register a call to `dbClearResult()` via `on.exit()` right after calling `dbSendQuery()` or `dbSendStatement()` (see the last enumeration item). Until `dbBind()` or `dbBindArrow()` have been called, the returned result set object has the following behavior: - `dbFetch()` raises an error (for `dbSendQuery()` and `dbSendQueryArrow()`) - `dbGetRowCount()` returns zero (for `dbSendQuery()` and `dbSendQueryArrow()`) - `dbGetRowsAffected()` returns an integer `NA` (for `dbSendStatement()`) - `dbIsValid()` returns `TRUE` - `dbHasCompleted()` returns `FALSE` 2. Call `dbBind()` or `dbBindArrow()`: - For `dbBind()`, the `params` argument must be a list where all elements have the same lengths and contain values supported by the backend. A data.frame is internally stored as such a list. - For `dbBindArrow()`, the `params` argument must be a nanoarrow array stream, with one column per query parameter. 3. Retrieve the data or the number of affected rows from the `DBIResult` object. - For queries issued by `dbSendQuery()` or `dbSendQueryArrow()`, call `dbFetch()`. - For statements issued by `dbSendStatements()`, call `dbGetRowsAffected()`. (Execution begins immediately after the `dbBind()` call, the statement is processed entirely before the function returns.) 4. Repeat 2. and 3. as necessary. 5. Close the result set via `dbClearResult()`. The elements of the `params` argument do not need to be scalars, vectors of arbitrary length (including length 0) are supported. For queries, calling `dbFetch()` binding such parameters returns concatenated results, equivalent to binding and fetching for each set of values and connecting via `rbind()`. For data manipulation statements, `dbGetRowsAffected()` returns the total number of rows affected if binding non-scalar parameters. `dbBind()` also accepts repeated calls on the same result set for both queries and data manipulation statements, even if no results are fetched between calls to `dbBind()`, for both queries and data manipulation statements. If the placeholders in the query are named, their order in the `params` argument is not important. At least the following data types are accepted on input (including NA): - integer - numeric - logical for Boolean values - character (also with special characters such as spaces, newlines, quotes, and backslashes) - factor (bound as character, with warning) - Date (also when stored internally as integer) - POSIXct timestamps - POSIXlt timestamps - difftime values (also with units other than seconds and with the value stored as integer) - lists of raw for blobs (with `NULL` entries for SQL NULL values) - objects of type blob::blob ### Examples ``` r # Data frame flow: con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "iris", iris) # Using the same query for different values iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") dbBind(iris_result, list(2.3)) dbFetch(iris_result) dbBind(iris_result, list(3)) dbFetch(iris_result) dbClearResult(iris_result) # Executing the same statement with different values at once iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = \$species") dbBind(iris_result, list(species = c("setosa", "versicolor", "unknown"))) dbGetRowsAffected(iris_result) dbClearResult(iris_result) nrow(dbReadTable(con, "iris")) dbDisconnect(con) # Arrow flow: con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "iris", iris) # Using the same query for different values iris_result <- dbSendQueryArrow(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") dbBindArrow( iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame(2.3, fix.empty.names = FALSE)) ) as.data.frame(dbFetchArrow(iris_result)) dbBindArrow( iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame(3, fix.empty.names = FALSE)) ) as.data.frame(dbFetchArrow(iris_result)) dbClearResult(iris_result) # Executing the same statement with different values at once iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = \$species") dbBindArrow(iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame( species = c("setosa", "versicolor", "unknown") ))) dbGetRowsAffected(iris_result) dbClearResult(iris_result) nrow(dbReadTable(con, "iris")) dbDisconnect(con) ``` ## Retrieve results from a query This section describes the behavior of the following method: ``` r dbGetQuery(conn, statement, ...) ``` ### Description Returns the result of a query as a data frame. `dbGetQuery()` comes with a default implementation (which should work with most backends) that calls `dbSendQuery()`, then `dbFetch()`, ensuring that the result is always freed by `dbClearResult()`. For retrieving chunked/paged results or for passing query parameters, see `dbSendQuery()`, in particular the "The data retrieval flow" section. For retrieving results as an Arrow object, see `dbGetQueryArrow()`. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbGetQuery()` generic (to improve compatibility across backends) but are part of the DBI specification: - `n` (default: -1) - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. ### Specification A column named `row_names` is treated like any other column. The `n` argument specifies the number of rows to be fetched. If omitted, fetching multi-row queries with one or more columns returns the entire result. A value of Inf for the `n` argument is supported and also returns the full result. If more rows than available are fetched (by passing a too large value for `n`), the result is returned in full without warning. If zero rows are requested, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued. The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details This method is for `SELECT` queries only (incl. other SQL statements that return a `SELECT`-alike result, e.g., execution of a stored procedure or data manipulation queries like `�INSERT INTO ... RETURNING ...�`). To execute a stored procedure that does not return a result set, use `dbExecute()`. Some backends may support data manipulation statements through this method for compatibility reasons. However, callers are strongly advised to use `dbExecute()` for data manipulation statements. ### Value `dbGetQuery()` always returns a data.frame, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. ### Implementation notes Subclasses should override this method only if they provide some sort of performance optimization. ### Failure modes An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-`NA` string. If the `n` argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to `dbGetQuery()` with proper `n` argument succeeds. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbGetQuery(con, "SELECT * FROM mtcars") dbGetQuery(con, "SELECT * FROM mtcars", n = 6) # Pass values using the param argument: # (This query runs eight times, once for each different # parameter. The resulting rows are combined into a single # data frame.) dbGetQuery( con, "SELECT COUNT(*) FROM mtcars WHERE cyl = ?", params = list(1:8) ) dbDisconnect(con) ``` ## Execute a data manipulation statement on a given database connection This section describes the behavior of the following method: ``` r dbSendStatement(conn, statement, ...) ``` ### Description The `dbSendStatement()` method only submits and synchronously executes the SQL data manipulation statement (e.g., `UPDATE`, `DELETE`, `�INSERT INTO�`, `�DROP TABLE�`, ...) to the database engine. To query the number of affected rows, call `dbGetRowsAffected()` on the returned result object. You must also call `dbClearResult()` after that. For interactive use, you should almost always prefer `dbExecute()`. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbSendStatement()` generic (to improve compatibility across backends) but are part of the DBI specification: - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" sections for details on their usage. ### Specification No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to `dbClearResult()`. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with `dbClearResult()`. The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details `dbSendStatement()` comes with a default implementation that simply forwards to `dbSendQuery()`, to support backends that only implement the latter. ### Value `dbSendStatement()` returns an S4 object that inherits from DBIResult. The result set can be used with `dbGetRowsAffected()` to determine the number of rows affected by the query. Once you have finished using a result, make sure to clear it with `dbClearResult()`. ### The command execution flow This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of `dbBindArrow()`, is implemented by `dbExecute()`, which should be sufficient for non-parameterized queries. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendStatement()` to create a result set object of class DBIResult. For some queries you need to pass `immediate = TRUE`. 2. Optionally, bind query parameters with`dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbGetRowsAffected()` to retrieve the number of rows affected by the query. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An error is raised when issuing a statement over a closed or invalid connection, or if the statement is not a non-`NA` string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the `params` argument) or the `immediate` argument is set to `TRUE`. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) dbHasCompleted(rs) dbGetRowsAffected(rs) dbClearResult(rs) dbReadTable(con, "cars") # there are now 6 rows # Pass one set of values directly using the param argument: rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)", params = list(4L, 5L) ) dbClearResult(rs) # Pass multiple sets of values using dbBind(): rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)" ) dbBind(rs, list(5:6, 6:7)) dbBind(rs, list(7L, 8L)) dbClearResult(rs) dbReadTable(con, "cars") # there are now 10 rows dbDisconnect(con) ``` ## Change database state This section describes the behavior of the following method: ``` r dbExecute(conn, statement, ...) ``` ### Description Executes a statement and returns the number of rows affected. `dbExecute()` comes with a default implementation (which should work with most backends) that calls `dbSendStatement()`, then `dbGetRowsAffected()`, ensuring that the result is always freed by `dbClearResult()`. For passing query parameters, see `dbBind()`, in particular the "The command execution flow" section. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbExecute()` generic (to improve compatibility across backends) but are part of the DBI specification: - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" sections for details on their usage. ### Specification The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details You can also use `dbExecute()` to call a stored procedure that performs data manipulation or other actions that do not return a result set. To execute a stored procedure that returns a result set, or a data manipulation query that also returns a result set such as `�INSERT INTO ... RETURNING ...�`, use `dbGetQuery()` instead. ### Value `dbExecute()` always returns a scalar numeric that specifies the number of rows affected by the statement. ### Implementation notes Subclasses should override this method only if they provide some sort of performance optimization. ### Failure modes An error is raised when issuing a statement over a closed or invalid connection, if the syntax of the statement is invalid, or if the statement is not a non-`NA` string. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) dbReadTable(con, "cars") # there are 3 rows dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) dbReadTable(con, "cars") # there are now 6 rows # Pass values using the param argument: dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)", params = list(4:7, 5:8) ) dbReadTable(con, "cars") # there are now 10 rows dbDisconnect(con) ``` ## Quote literal strings This section describes the behavior of the following method: ``` r dbQuoteString(conn, x, ...) ``` ### Description Call this method to generate a string that is suitable for use in a query as a string literal, to make sure that you generate valid SQL and protect against SQL injection attacks. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `x` | A character vector to quote as string. | | `...` | Other arguments passed on to methods. | ### Value `dbQuoteString()` returns an object that can be coerced to character, of the same length as the input. For an empty character vector this function returns a length-0 object. When passing the returned object again to `dbQuoteString()` as `x` argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.) ### Failure modes Passing a numeric, integer, logical, or raw vector, or a list for the `x` argument raises an error. ### Specification The returned expression can be used in a `�SELECT ...�` query, and for any scalar character `x` the value of `dbGetQuery(paste0("SELECT ", dbQuoteString(x)))[[1]]` must be identical to `x`, even if `x` contains spaces, tabs, quotes (single or double), backticks, or newlines (in any combination) or is itself the result of a `dbQuoteString()` call coerced back to character (even repeatedly). If `x` is `NA`, the result must merely satisfy `is.na()`. The strings `"NA"` or `"NULL"` are not treated specially. `NA` should be translated to an unquoted SQL `NULL`, so that the query `�SELECT * FROM (SELECT 1) a WHERE ... IS NULL�` returns one row. ### Examples ``` r # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteString(ANSI(), name) # NAs become NULL dbQuoteString(ANSI(), c("x", NA)) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteString(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteString(ANSI(), dbQuoteString(ANSI(), name)) ``` ## Quote literal values This section describes the behavior of the following method: ``` r dbQuoteLiteral(conn, x, ...) ``` ### Description Call these methods to generate a string that is suitable for use in a query as a literal value of the correct type, to make sure that you generate valid SQL and protect against SQL injection attacks. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `x` | A vector to quote as string. | | `...` | Other arguments passed on to methods. | ### Value `dbQuoteLiteral()` returns an object that can be coerced to character, of the same length as the input. For an empty integer, numeric, character, logical, date, time, or blob vector, this function returns a length-0 object. When passing the returned object again to `dbQuoteLiteral()` as `x` argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.) ### Failure modes Passing a list for the `x` argument raises an error. ### Specification The returned expression can be used in a `�SELECT ...�` query, and the value of `dbGetQuery(paste0("SELECT ", dbQuoteLiteral(x)))[[1]]` must be equal to `x` for any scalar integer, numeric, string, and logical. If `x` is `NA`, the result must merely satisfy `is.na()`. The literals `"NA"` or `"NULL"` are not treated specially. `NA` should be translated to an unquoted SQL `NULL`, so that the query `�SELECT * FROM (SELECT 1) a WHERE ... IS NULL�` returns one row. ### Examples ``` r # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteLiteral(ANSI(), name) # NAs become NULL dbQuoteLiteral(ANSI(), c(1:3, NA)) # Logicals become integers by default dbQuoteLiteral(ANSI(), c(TRUE, FALSE, NA)) # Raw vectors become hex strings by default dbQuoteLiteral(ANSI(), list(as.raw(1:3), NULL)) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteLiteral(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteLiteral(ANSI(), dbQuoteLiteral(ANSI(), name)) ``` ## Quote identifiers This section describes the behavior of the following method: ``` r dbQuoteIdentifier(conn, x, ...) ``` ### Description Call this method to generate a string that is suitable for use in a query as a column or table name, to make sure that you generate valid SQL and protect against SQL injection attacks. The inverse operation is `dbUnquoteIdentifier()`. ### Arguments | | | |--------|--------------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `x` | A character vector, SQL or Id object to quote as identifier. | | `...` | Other arguments passed on to methods. | ### Value `dbQuoteIdentifier()` returns an object that can be coerced to character, of the same length as the input. For an empty character vector this function returns a length-0 object. The names of the input argument are preserved in the output. When passing the returned object again to `dbQuoteIdentifier()` as `x` argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.) ### Failure modes An error is raised if the input contains `NA`, but not for an empty string. ### Specification Calling `dbGetQuery()` for a query of the format `�SELECT 1 AS ...�` returns a data frame with the identifier, unquoted, as column name. Quoted identifiers can be used as table and column names in SQL queries, in particular in queries like `�SELECT 1 AS ...�` and `�SELECT * FROM (SELECT 1) ...�`. The method must use a quoting mechanism that is unambiguously different from the quoting mechanism used for strings, so that a query like `�SELECT ... FROM (SELECT 1 AS ...)�` throws an error if the column names do not match. The method can quote column names that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this. In any case, checking the validity of the identifier should be performed only when executing a query, and not by `dbQuoteIdentifier()`. ### Examples ``` r # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteIdentifier(ANSI(), name) # Use Id() to specify other components such as the schema id_name <- Id(schema = "schema_name", table = "table_name") id_name dbQuoteIdentifier(ANSI(), id_name) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteIdentifier(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteIdentifier(ANSI(), dbQuoteIdentifier(ANSI(), name)) ``` ## Unquote identifiers This section describes the behavior of the following method: ``` r dbUnquoteIdentifier(conn, x, ...) ``` ### Description Call this method to convert a SQL object created by `dbQuoteIdentifier()` back to a list of Id objects. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `x` | An SQL or Id object. | | `...` | Other arguments passed on to methods. | ### Value `dbUnquoteIdentifier()` returns a list of objects of the same length as the input. For an empty vector, this function returns a length-0 object. The names of the input argument are preserved in the output. If `x` is a value returned by `dbUnquoteIdentifier()`, calling `dbUnquoteIdentifier(..., dbQuoteIdentifier(..., x))` returns `list(x)`. If `x` is an object of class Id, calling `dbUnquoteIdentifier(..., x)` returns `list(x)`. (For backends it may be most convenient to return Id objects to achieve this behavior, but this is not required.) Plain character vectors can also be passed to `dbUnquoteIdentifier()`. ### Failure modes An error is raised if a character vectors with a missing value is passed as the `x` argument. ### Specification For any character vector of length one, quoting (with `dbQuoteIdentifier()`) then unquoting then quoting the first element is identical to just quoting. This is also true for strings that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this. Unquoting simple strings (consisting of only letters) wrapped with `SQL()` and then quoting via `dbQuoteIdentifier()` gives the same result as just quoting the string. Similarly, unquoting expressions of the form `SQL("schema.table")` and then quoting gives the same result as quoting the identifier constructed by `Id("schema", "table")`. ### Examples ``` r # Unquoting allows to understand the structure of a # possibly complex quoted identifier dbUnquoteIdentifier( ANSI(), SQL(c('"Catalog"."Schema"."Table"', '"Schema"."Table"', '"UnqualifiedTable"')) ) # The returned object is always a list, # also for Id objects dbUnquoteIdentifier(ANSI(), Id("Catalog", "Schema", "Table")) # Quoting and unquoting are inverses dbQuoteIdentifier( ANSI(), dbUnquoteIdentifier(ANSI(), SQL("UnqualifiedTable"))[[1]] ) dbQuoteIdentifier( ANSI(), dbUnquoteIdentifier(ANSI(), Id("Schema", "Table"))[[1]] ) ``` ## Read database tables as data frames This section describes the behavior of the following method: ``` r dbReadTable(conn, name, ...) ``` ### Description Reads a database table to a data frame, optionally converting a column to row names and converting the column names to valid R identifiers. Use `dbReadTableArrow()` instead to obtain an Arrow object. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

...

Other parameters passed on to methods.

### Additional arguments The following arguments are not part of the `dbReadTable()` generic (to improve compatibility across backends) but are part of the DBI specification: - `row.names` (default: `FALSE`) - `check.names` They must be provided as named arguments. See the "Value" section for details on their usage. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbReadTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done ### Details This function returns a data frame. Use `dbReadTableArrow()` to obtain an Arrow object. ### Value `dbReadTable()` returns a data frame that contains the complete data from the remote table, effectively the result of calling `dbGetQuery()` with `�SELECT * FROM �`. An empty table is returned as a data frame with zero rows. The presence of rownames depends on the `row.names` argument, see `sqlColumnToRownames()` for details: - If `FALSE` or `NULL`, the returned data frame doesn't have row names. - If `TRUE`, a column named "row_names" is converted to row names. - If `NA`, a column named "row_names" is converted to row names if it exists, otherwise no translation occurs. - If a string, this specifies the name of the column in the remote table that contains the row names. The default is `row.names = FALSE`. If the database supports identifiers with special characters, the columns in the returned data frame are converted to valid R identifiers if the `check.names` argument is `TRUE`, If `check.names = FALSE`, the returned table has non-syntactic column names without quotes. ### Failure modes An error is raised if the table does not exist. An error is raised if `row.names` is `TRUE` and no "row_names" column exists, An error is raised if `row.names` is set to a string and no corresponding column exists. An error is raised when calling this method for a closed or invalid connection. An error is raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Unsupported values for `row.names` and `check.names` (non-scalars, unsupported data types, `NA` for `check.names`) also raise an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:10, ]) dbReadTable(con, "mtcars") dbDisconnect(con) ``` ## Copy data frames to database tables This section describes the behavior of the following method: ``` r dbWriteTable(conn, name, value, ...) ``` ### Description Writes, overwrites or appends a data frame to a database table, optionally converting row names to a column and specifying SQL data types for fields. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

value

A data.frame (or coercible to data.frame).

...

Other parameters passed on to methods.

### Additional arguments The following arguments are not part of the `dbWriteTable()` generic (to improve compatibility across backends) but are part of the DBI specification: - `row.names` (default: `FALSE`) - `overwrite` (default: `FALSE`) - `append` (default: `FALSE`) - `field.types` (default: `NULL`) - `temporary` (default: `FALSE`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbWriteTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done The `value` argument must be a data frame with a subset of the columns of the existing table if `append = TRUE`. The order of the columns does not matter with `append = TRUE`. If the `overwrite` argument is `TRUE`, an existing table of the same name will be overwritten. This argument doesn't change behavior if the table does not exist yet. If the `append` argument is `TRUE`, the rows in an existing table are preserved, and the new data are appended. If the table doesn't exist yet, it is created. If the `temporary` argument is `TRUE`, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with `dbReadTable()`: - integer - numeric (the behavior for `Inf` and `NaN` is not specified) - logical - `NA` as NULL - 64-bit values (using `"bigint"` as field type); the result can be - converted to a numeric, which may lose precision, - converted a character vector, which gives the full decimal representation - written to another table and read again unchanged - character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string - factor (returned as character) - list of raw (if supported by the database) - objects of type blob::blob (if supported by the database) - date (if supported by the database; returned as `Date`), also for dates prior to 1970 or 1900 or after 2038 - time (if supported by the database; returned as objects that inherit from `difftime`) - timestamp (if supported by the database; returned as `POSIXct` respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) Mixing column types in the same table is supported. The `field.types` argument must be a named character vector with at most one entry for each column. It indicates the SQL data type to be used for a new column. If a column is missed from `field.types`, the type is inferred from the input data with `dbDataType()`. The interpretation of rownames depends on the `row.names` argument, see `sqlRownamesToColumn()` for details: - If `FALSE` or `NULL`, row names are ignored. - If `TRUE`, row names are converted to a column named "row_names", even if the input data frame only has natural row names from 1 to `nrow(...)`. - If `NA`, a column named "row_names" is created if the data has custom row names, no extra column is created in the case of natural row names. - If a string, this specifies the name of the column in the remote table that contains the row names, even if the input data frame only has natural row names. The default is `row.names = FALSE`. ### Details This function expects a data frame. Use `dbWriteTableArrow()` to write an Arrow object. This function is useful if you want to create and load a table at the same time. Use `dbAppendTable()` or `dbAppendTableArrow()` for appending data to an existing table, `dbCreateTable()` or `dbCreateTableArrow()` for creating a table, and `dbExistsTable()` and `dbRemoveTable()` for overwriting tables. DBI only standardizes writing data frames with `dbWriteTable()`. Some backends might implement methods that can consume CSV files or other data formats. For details, see the documentation for the individual methods. ### Value `dbWriteTable()` returns `TRUE`, invisibly. ### Failure modes If the table exists, and both `append` and `overwrite` arguments are unset, or `append = TRUE` and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Invalid values for the additional arguments `row.names`, `overwrite`, `append`, `field.types`, and `temporary` (non-scalars, unsupported data types, `NA`, incompatible values, duplicate or missing names, incompatible columns) also raise an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:5, ]) dbReadTable(con, "mtcars") dbWriteTable(con, "mtcars", mtcars[6:10, ], append = TRUE) dbReadTable(con, "mtcars") dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE) dbReadTable(con, "mtcars") # No row names dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE, row.names = FALSE) dbReadTable(con, "mtcars") ``` ## Create a table in the database This section describes the behavior of the following method: ``` r dbCreateTable(conn, name, fields, ..., row.names = NULL, temporary = FALSE) ``` ### Description The default `dbCreateTable()` method calls `sqlCreateTable()` and `dbExecute()`. Use `dbCreateTableArrow()` to create a table from an Arrow schema. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

fields

Either a character vector or a data frame.

A named character vector: Names are column names, values are types. Names are escaped with dbQuoteIdentifier(). Field types are unescaped.

A data frame: field types are generated using dbDataType().

...

Other parameters passed on to methods.

row.names

Must be NULL.

temporary

If TRUE, will generate a temporary table.

### Additional arguments The following arguments are not part of the `dbCreateTable()` generic (to improve compatibility across backends) but are part of the DBI specification: - `temporary` (default: `FALSE`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbCreateTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done The `value` argument can be: - a data frame, - a named list of SQL types If the `temporary` argument is `TRUE`, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers. The `row.names` argument must be missing or `NULL`, the default value. All other values for the `row.names` argument (in particular `TRUE`, `NA`, and a string) raise an error. ### Details Backends compliant to ANSI SQL 99 don't need to override it. Backends with a different SQL syntax can override `sqlCreateTable()`, backends with entirely different ways to create tables need to override this method. The `row.names` argument is not supported by this method. Process the values with `sqlRownamesToColumn()` before calling this method. The argument order is different from the `sqlCreateTable()` method, the latter will be adapted in a later release of DBI. ### Value `dbCreateTable()` returns `TRUE`, invisibly. ### Failure modes If the table exists, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Invalid values for the `row.names` and `temporary` arguments (non-scalars, unsupported data types, `NA`, incompatible values, duplicate names) also raise an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTable(con, "iris", iris) dbReadTable(con, "iris") dbDisconnect(con) ``` ## Insert rows into a table This section describes the behavior of the following method: ``` r dbAppendTable(conn, name, value, ..., row.names = NULL) ``` ### Description The `dbAppendTable()` method assumes that the table has been created beforehand, e.g. with `dbCreateTable()`. The default implementation calls `sqlAppendTableTemplate()` and then `dbExecute()` with the `param` argument. Use `dbAppendTableArrow()` to append data from an Arrow stream. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

value

A data.frame (or coercible to data.frame).

...

Other parameters passed on to methods.

row.names

Must be NULL.

### Details Backends compliant to ANSI SQL 99 which use `�?�` as a placeholder for prepared queries don't need to override it. Backends with a different SQL syntax which use `�?�` as a placeholder for prepared queries can override `sqlAppendTable()`. Other backends (with different placeholders or with entirely different ways to create tables) need to override the `dbAppendTable()` method. The `row.names` argument is not supported by this method. Process the values with `sqlRownamesToColumn()` before calling this method. ### Value `dbAppendTable()` returns a scalar numeric. ### Failure modes If the table does not exist, or the new data in `values` is not a data frame or has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Invalid values for the `row.names` argument (non-scalars, unsupported data types, `NA`) also raise an error. Passing a `value` argument different to `NULL` to the `row.names` argument (in particular `TRUE`, `NA`, and a string) raises an error. ### Specification SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with `dbReadTable()`: - integer - numeric (the behavior for `Inf` and `NaN` is not specified) - logical - `NA` as NULL - 64-bit values (using `"bigint"` as field type); the result can be - converted to a numeric, which may lose precision, - converted a character vector, which gives the full decimal representation - written to another table and read again unchanged - character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings) - factor (returned as character, with a warning) - list of raw (if supported by the database) - objects of type blob::blob (if supported by the database) - date (if supported by the database; returned as `Date`) also for dates prior to 1970 or 1900 or after 2038 - time (if supported by the database; returned as objects that inherit from `difftime`) - timestamp (if supported by the database; returned as `POSIXct` respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) Mixing column types in the same table is supported. The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbAppendTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done to support databases that allow non-syntactic names for their objects: The `row.names` argument must be `NULL`, the default value. Row names are ignored. The `value` argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTable(con, "iris", iris) dbAppendTable(con, "iris", iris) dbReadTable(con, "iris") dbDisconnect(con) ``` ## Remove a table from the database This section describes the behavior of the following method: ``` r dbRemoveTable(conn, name, ...) ``` ### Description Remove a remote table (e.g., created by `dbWriteTable()`) from the database. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

...

Other parameters passed on to methods.

### Additional arguments The following arguments are not part of the `dbRemoveTable()` generic (to improve compatibility across backends) but are part of the DBI specification: - `temporary` (default: `FALSE`) - `fail_if_missing` (default: `TRUE`) These arguments must be provided as named arguments. If `temporary` is `TRUE`, the call to `dbRemoveTable()` will consider only temporary tables. Not all backends support this argument. In particular, permanent tables of the same name are left untouched. If `fail_if_missing` is `FALSE`, the call to `dbRemoveTable()` succeeds if the table does not exist. ### Specification A table removed by `dbRemoveTable()` doesn't appear in the list of tables returned by `dbListTables()`, and `dbExistsTable()` returns `FALSE`. The removal propagates immediately to other connections to the same database. This function can also be used to remove a temporary table. The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbRemoveTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done ### Value `dbRemoveTable()` returns `TRUE`, invisibly. ### Failure modes If the table does not exist, an error is raised. An attempt to remove a view with this function may result in an error. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbExistsTable(con, "iris") dbWriteTable(con, "iris", iris) dbExistsTable(con, "iris") dbRemoveTable(con, "iris") dbExistsTable(con, "iris") dbDisconnect(con) ``` ## List remote tables This section describes the behavior of the following method: ``` r dbListTables(conn, ...) ``` ### Description Returns the unquoted names of remote tables accessible through this connection. This should include views and temporary objects, but not all database backends (in particular RMariaDB and RMySQL) support this. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `...` | Other parameters passed on to methods. | ### Value `dbListTables()` returns a character vector that enumerates all tables and views in the database. Tables added with `dbWriteTable()` are part of the list. As soon a table is removed from the database, it is also removed from the list of database tables. The same applies to temporary tables if supported by the database. The returned names are suitable for quoting with `dbQuoteIdentifier()`. ### Failure modes An error is raised when calling this method for a closed or invalid connection. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbListTables(con) dbWriteTable(con, "mtcars", mtcars) dbListTables(con) dbDisconnect(con) ``` ## List field names of a remote table This section describes the behavior of the following method: ``` r dbListFields(conn, name, ...) ``` ### Description Returns the field names of a remote table as a character vector. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

...

Other parameters passed on to methods.

### Value `dbListFields()` returns a character vector that enumerates all fields in the table in the correct order. This also works for temporary tables if supported by the database. The returned names are suitable for quoting with `dbQuoteIdentifier()`. ### Failure modes If the table does not exist, an error is raised. Invalid types for the `name` argument (e.g., `character` of length not equal to one, or numeric) lead to an error. An error is also raised when calling this method for a closed or invalid connection. ### Specification The `name` argument can be - a string - the return value of `dbQuoteIdentifier()` - a value from the `table` column from the return value of `dbListObjects()` where `is_prefix` is `FALSE` A column named `row_names` is treated like any other column. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbListFields(con, "mtcars") dbDisconnect(con) ``` ## Does a table exist? This section describes the behavior of the following method: ``` r dbExistsTable(conn, name, ...) ``` ### Description Returns if a table given by name exists in the database. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

...

Other parameters passed on to methods.

### Value `dbExistsTable()` returns a logical scalar, `TRUE` if the table or view specified by the `name` argument exists, `FALSE` otherwise. This includes temporary tables if supported by the database. ### Failure modes An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbExistsTable()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done For all tables listed by `dbListTables()`, `dbExistsTable()` returns `TRUE`. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbExistsTable(con, "iris") dbWriteTable(con, "iris", iris) dbExistsTable(con, "iris") dbDisconnect(con) ``` ## List remote objects This section describes the behavior of the following method: ``` r dbListObjects(conn, prefix = NULL, ...) ``` ### Description Returns the names of remote objects accessible through this connection as a data frame. This should include temporary objects, but not all database backends (in particular RMariaDB and RMySQL) support this. Compared to `dbListTables()`, this method also enumerates tables and views in schemas, and returns fully qualified identifiers to access these objects. This allows exploration of all database objects available to the current user, including those that can only be accessed by giving the full namespace. ### Arguments | | | |----|----| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `prefix` | A fully qualified path in the database's namespace, or `NULL`. This argument will be processed with `dbUnquoteIdentifier()`. If given the method will return all objects accessible through this prefix. | | `...` | Other parameters passed on to methods. | ### Value `dbListObjects()` returns a data frame with columns `table` and `is_prefix` (in that order), optionally with other columns with a dot (`.`) prefix. The `table` column is of type list. Each object in this list is suitable for use as argument in `dbQuoteIdentifier()`. The `is_prefix` column is a logical. This data frame contains one row for each object (schema, table and view) accessible from the prefix (if passed) or from the global namespace (if prefix is omitted). Tables added with `dbWriteTable()` are part of the data frame. As soon a table is removed from the database, it is also removed from the data frame of database objects. The same applies to temporary objects if supported by the database. The returned names are suitable for quoting with `dbQuoteIdentifier()`. ### Failure modes An error is raised when calling this method for a closed or invalid connection. ### Specification The `prefix` column indicates if the `table` value refers to a table or a prefix. For a call with the default `prefix = NULL`, the `table` values that have `is_prefix == FALSE` correspond to the tables returned from `dbListTables()`, The `table` object can be quoted with `dbQuoteIdentifier()`. The result of quoting can be passed to `dbUnquoteIdentifier()`. (For backends it may be convenient to use the Id class, but this is not required.) Values in `table` column that have `is_prefix == TRUE` can be passed as the `prefix` argument to another call to `dbListObjects()`. For the data frame returned from a `dbListObject()` call with the `prefix` argument set, all `table` values where `is_prefix` is `FALSE` can be used in a call to `dbExistsTable()` which returns `TRUE`. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbListObjects(con) dbWriteTable(con, "mtcars", mtcars) dbListObjects(con) dbDisconnect(con) ``` ## Is this DBMS object still valid? This section describes the behavior of the following method: ``` r dbIsValid(dbObj, ...) ``` ### Description This generic tests whether a database object is still valid (i.e. it hasn't been disconnected or cleared). ### Arguments | | | |----|----| | `dbObj` | An object inheriting from DBIObject, i.e. DBIDriver, DBIConnection, or a DBIResult | | `...` | Other arguments to methods. | ### Value `dbIsValid()` returns a logical scalar, `TRUE` if the object specified by `dbObj` is valid, `FALSE` otherwise. A DBIConnection object is initially valid, and becomes invalid after disconnecting with `dbDisconnect()`. For an invalid connection object (e.g., for some drivers if the object is saved to a file and then restored), the method also returns `FALSE`. A DBIResult object is valid after a call to `dbSendQuery()`, and stays valid even after all rows have been fetched; only clearing it with `dbClearResult()` invalidates it. A DBIResult object is also valid after a call to `dbSendStatement()`, and stays valid after querying the number of rows affected; only clearing it with `dbClearResult()` invalidates it. If the connection to the database system is dropped (e.g., due to connectivity problems, server failure, etc.), `dbIsValid()` should return `FALSE`. This is not tested automatically. ### Examples ``` r dbIsValid(RSQLite::SQLite()) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbIsValid(con) rs <- dbSendQuery(con, "SELECT 1") dbIsValid(rs) dbClearResult(rs) dbIsValid(rs) dbDisconnect(con) dbIsValid(con) ``` ## Completion status This section describes the behavior of the following method: ``` r dbHasCompleted(res, ...) ``` ### Description This method returns if the operation has completed. A `SELECT` query is completed if all rows have been fetched. A data manipulation statement is always completed. ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbHasCompleted()` returns a logical scalar. For a query initiated by `dbSendQuery()` with non-empty result set, `dbHasCompleted()` returns `FALSE` initially and `TRUE` after calling `dbFetch()` without limit. For a query initiated by `dbSendStatement()`, `dbHasCompleted()` always returns `TRUE`. ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes Attempting to query completion status for a result set cleared with `dbClearResult()` gives an error. ### Specification The completion status for a query is only guaranteed to be set to `FALSE` after attempting to fetch past the end of the entire result. Therefore, for a query with an empty result set, the initial return value is unspecified, but the result value is `TRUE` after trying to fetch only one row. Similarly, for a query with a result set of length n, the return value is unspecified after fetching n rows, but the result value is `TRUE` after trying to fetch only one more row. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbHasCompleted(rs) ret1 <- dbFetch(rs, 10) dbHasCompleted(rs) ret2 <- dbFetch(rs) dbHasCompleted(rs) dbClearResult(rs) dbDisconnect(con) ``` ## Get the statement associated with a result set This section describes the behavior of the following method: ``` r dbGetStatement(res, ...) ``` ### Description Returns the statement that was passed to `dbSendQuery()` or `dbSendStatement()`. ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbGetStatement()` returns a string, the query used in either `dbSendQuery()` or `dbSendStatement()`. ### Failure modes Attempting to query the statement for a result set cleared with `dbClearResult()` gives an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbGetStatement(rs) dbClearResult(rs) dbDisconnect(con) ``` ## The number of rows fetched so far This section describes the behavior of the following method: ``` r dbGetRowCount(res, ...) ``` ### Description Returns the total number of rows actually fetched with calls to `dbFetch()` for this result set. ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbGetRowCount()` returns a scalar number (integer or numeric), the number of rows fetched so far. After calling `dbSendQuery()`, the row count is initially zero. After a call to `dbFetch()` without limit, the row count matches the total number of rows returned. Fetching a limited number of rows increases the number of rows by the number of rows returned, even if fetching past the end of the result set. For queries with an empty result set, zero is returned even after fetching. For data manipulation statements issued with `dbSendStatement()`, zero is returned before and after calling `dbFetch()`. ### Failure modes Attempting to get the row count for a result set cleared with `dbClearResult()` gives an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbGetRowCount(rs) ret1 <- dbFetch(rs, 10) dbGetRowCount(rs) ret2 <- dbFetch(rs) dbGetRowCount(rs) nrow(ret1) + nrow(ret2) dbClearResult(rs) dbDisconnect(con) ``` ## The number of rows affected This section describes the behavior of the following method: ``` r dbGetRowsAffected(res, ...) ``` ### Description This method returns the number of rows that were added, deleted, or updated by a data manipulation statement. ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbGetRowsAffected()` returns a scalar number (integer or numeric), the number of rows affected by a data manipulation statement issued with `dbSendStatement()`. The value is available directly after the call and does not change after calling `dbFetch()`. `NA_integer_` or `NA_numeric_` are allowed if the number of rows affected is not known. For queries issued with `dbSendQuery()`, zero is returned before and after the call to `dbFetch()`. `NA` values are not allowed. ### The command execution flow This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of `dbBindArrow()`, is implemented by `dbExecute()`, which should be sufficient for non-parameterized queries. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendStatement()` to create a result set object of class DBIResult. For some queries you need to pass `immediate = TRUE`. 2. Optionally, bind query parameters with`dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbGetRowsAffected()` to retrieve the number of rows affected by the query. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes Attempting to get the rows affected for a result set cleared with `dbClearResult()` gives an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendStatement(con, "DELETE FROM mtcars") dbGetRowsAffected(rs) nrow(mtcars) dbClearResult(rs) dbDisconnect(con) ``` ## Information about result types This section describes the behavior of the following method: ``` r dbColumnInfo(res, ...) ``` ### Description Produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame describes an aspect of the result set field (field name, type, etc.) ### Arguments | | | |-------|---------------------------------------| | `res` | An object inheriting from DBIResult. | | `...` | Other arguments passed on to methods. | ### Value `dbColumnInfo()` returns a data frame with at least two columns `"name"` and `"type"` (in that order) (and optional columns that start with a dot). The `"name"` and `"type"` columns contain the names and types of the R columns of the data frame that is returned from `dbFetch()`. The `"type"` column is of type `character` and only for information. Do not compute on the `"type"` column, instead use `dbFetch(res, n = 0)` to create a zero-row data frame initialized with the correct data types. ### The data retrieval flow This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of `dbBind()` or `dbBindArrow()`, is implemented by `dbGetQuery()`, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQuery()` to create a result set object of class DBIResult. 2. Optionally, bind query parameters with `dbBind()` or `dbBindArrow()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Optionally, use `dbColumnInfo()` to retrieve the structure of the result set without retrieving actual data. 4. Use `dbFetch()` to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. 5. Use `dbHasCompleted()` to tell when you're done. This method returns `TRUE` if no more rows are available for fetching. 6. Repeat the last four steps as necessary. 7. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An attempt to query columns for a closed result set raises an error. ### Specification A column named `row_names` is treated like any other column. The column names are always consistent with the data returned by `dbFetch()`. If the query returns unnamed columns, non-empty and non-`NA` names are assigned. Column names that correspond to SQL or R keywords are left unchanged. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") rs <- dbSendQuery(con, "SELECT 1 AS a, 2 AS b") dbColumnInfo(rs) dbFetch(rs) dbClearResult(rs) dbDisconnect(con) ``` ## Begin/commit/rollback SQL transactions This section describes the behavior of the following methods: ``` r dbBegin(conn, ...) dbCommit(conn, ...) dbRollback(conn, ...) ``` ### Description A transaction encapsulates several SQL statements in an atomic unit. It is initiated with `dbBegin()` and either made persistent with `dbCommit()` or undone with `dbRollback()`. In any case, the DBMS guarantees that either all or none of the statements have a permanent effect. This helps ensuring consistency of write operations to multiple tables. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `...` | Other parameters passed on to methods. | ### Details Not all database engines implement transaction management, in which case these methods should not be implemented for the specific DBIConnection subclass. ### Value `dbBegin()`, `dbCommit()` and `dbRollback()` return `TRUE`, invisibly. ### Failure modes The implementations are expected to raise an error in case of failure, but this is not tested. In any way, all generics throw an error with a closed or invalid connection. In addition, a call to `dbCommit()` or `dbRollback()` without a prior call to `dbBegin()` raises an error. Nested transactions are not supported by DBI, an attempt to call `dbBegin()` twice yields an error. ### Specification Actual support for transactions may vary between backends. A transaction is initiated by a call to `dbBegin()` and committed by a call to `dbCommit()`. Data written in a transaction must persist after the transaction is committed. For example, a record that is missing when the transaction is started but is created during the transaction must exist both during and after the transaction, and also in a new connection. A transaction can also be aborted with `dbRollback()`. All data written in such a transaction must be removed after the transaction is rolled back. For example, a record that is missing when the transaction is started but is created during the transaction must not exist anymore after the rollback. Disconnection from a connection with an open transaction effectively rolls back the transaction. All data written in such a transaction must be removed after the transaction is rolled back. The behavior is not specified if other arguments are passed to these functions. In particular, RSQLite issues named transactions with support for nesting if the `name` argument is set. The transaction isolation level is not specified by DBI. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) # All operations are carried out as logical unit: dbBegin(con) withdrawal <- 300 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) dbCommit(con) dbReadTable(con, "cash") dbReadTable(con, "account") # Rolling back after detecting negative value on account: dbBegin(con) withdrawal <- 5000 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) if (dbReadTable(con, "account")\$amount >= 0) { dbCommit(con) } else { dbRollback(con) } dbReadTable(con, "cash") dbReadTable(con, "account") dbDisconnect(con) ``` ## Self-contained SQL transactions This section describes the behavior of the following methods: ``` r dbWithTransaction(conn, code, ...) dbBreak() ``` ### Description Given that transactions are implemented, this function allows you to pass in code that is run in a transaction. The default method of `dbWithTransaction()` calls `dbBegin()` before executing the code, and `dbCommit()` after successful completion, or `dbRollback()` in case of an error. The advantage is that you don't have to remember to do `dbBegin()` and `dbCommit()` or `dbRollback()` – that is all taken care of. The special function `dbBreak()` allows an early exit with rollback, it can be called only inside `dbWithTransaction()`. ### Arguments | | | |--------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `code` | An arbitrary block of R code. | | `...` | Other parameters passed on to methods. | ### Details DBI implements `dbWithTransaction()`, backends should need to override this generic only if they implement specialized handling. ### Value `dbWithTransaction()` returns the value of the executed code. ### Failure modes Failure to initiate the transaction (e.g., if the connection is closed or invalid or if `dbBegin()` has been called already) gives an error. ### Specification `dbWithTransaction()` initiates a transaction with `dbBegin()`, executes the code given in the `code` argument, and commits the transaction with `dbCommit()`. If the code raises an error, the transaction is instead aborted with `dbRollback()`, and the error is propagated. If the code calls `dbBreak()`, execution of the code stops and the transaction is silently aborted. All side effects caused by the code (such as the creation of new variables) propagate to the calling environment. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) # All operations are carried out as logical unit: dbWithTransaction( con, { withdrawal <- 300 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) } ) # The code is executed as if in the current environment: withdrawal # The changes are committed to the database after successful execution: dbReadTable(con, "cash") dbReadTable(con, "account") # Rolling back with dbBreak(): dbWithTransaction( con, { withdrawal <- 5000 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) if (dbReadTable(con, "account")\$amount < 0) { dbBreak() } } ) # These changes were not committed to the database: dbReadTable(con, "cash") dbReadTable(con, "account") dbDisconnect(con) ``` ## Get DBMS metadata This section describes the behavior of the following method: ``` r dbGetInfo(dbObj, ...) ``` ### Description Retrieves information on objects of class DBIDriver, DBIConnection or DBIResult. ### Arguments | | | |----|----| | `dbObj` | An object inheriting from DBIObject, i.e. DBIDriver, DBIConnection, or a DBIResult | | `...` | Other arguments to methods. | ### Value For objects of class DBIDriver, `dbGetInfo()` returns a named list that contains at least the following components: - `driver.version`: the package version of the DBI backend, - `client.version`: the version of the DBMS client library. For objects of class DBIConnection, `dbGetInfo()` returns a named list that contains at least the following components: - `db.version`: version of the database server, - `dbname`: database name, - `username`: username to connect to the database, - `host`: hostname of the database server, - `port`: port on the database server. It must not contain a `password` component. Components that are not applicable should be set to `NA`. For objects of class DBIResult, `dbGetInfo()` returns a named list that contains at least the following components: - `statatment`: the statement used with `dbSendQuery()` or `dbExecute()`, as returned by `dbGetStatement()`, - `row.count`: the number of rows fetched so far (for queries), as returned by `dbGetRowCount()`, - `rows.affected`: the number of rows affected (for statements), as returned by `dbGetRowsAffected()` - `has.completed`: a logical that indicates if the query or statement has completed, as returned by `dbHasCompleted()`. ### Implementation notes The default implementation for `�DBIResult objects�` constructs such a list from the return values of the corresponding methods, `dbGetStatement()`, `dbGetRowCount()`, `dbGetRowsAffected()`, and `dbHasCompleted()`. ### Examples ``` r dbGetInfo(RSQLite::SQLite()) ``` ## Execute a query on a given database connection for retrieval via Arrow This section describes the behavior of the following method: ``` r dbSendQueryArrow(conn, statement, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) The `dbSendQueryArrow()` method only submits and synchronously executes the SQL query to the database engine. It does *not* extract any records — for that you need to use the `dbFetchArrow()` method, and then you must call `dbClearResult()` when you finish fetching the records you need. For interactive use, you should almost always prefer `dbGetQueryArrow()`. Use `dbSendQuery()` or `dbGetQuery()` instead to retrieve the results as a data frame. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbSendQueryArrow()` generic (to improve compatibility across backends) but are part of the DBI specification: - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" sections for details on their usage. ### Specification No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to `dbClearResult()`. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with `dbClearResult()`. The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details This method is for `SELECT` queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use `dbSendStatement()` for data manipulation statements. ### Value `dbSendQueryArrow()` returns an S4 object that inherits from DBIResultArrow. The result set can be used with `dbFetchArrow()` to extract records. Once you have finished using a result, make sure to clear it with `dbClearResult()`. ### The data retrieval flow for Arrow streams This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of `dbBindArrow()` or `dbBind()`, is implemented by `dbGetQueryArrow()`, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQueryArrow()` to create a result set object of class DBIResultArrow. 2. Optionally, bind query parameters with `dbBindArrow()` or `dbBind()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Use `dbFetchArrow()` to get a data stream. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-`NA` string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the `params` argument) or the `immediate` argument is set to `TRUE`. ### Examples ``` r # Retrieve data as arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetchArrow(rs) dbClearResult(rs) dbDisconnect(con) ``` ## Fetch records from a previously executed query as an Arrow object This section describes the behavior of the following method: ``` r dbFetchArrow(res, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) Fetch the result set and return it as an Arrow object. Use `dbFetchArrowChunk()` to fetch results in chunks. ### Arguments | | | |----|----| | `res` | An object inheriting from DBIResultArrow, created by `dbSendQueryArrow()`. | | `...` | Other arguments passed on to methods. | ### Value `dbFetchArrow()` always returns an object coercible to a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. ### The data retrieval flow for Arrow streams This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of `dbBindArrow()` or `dbBind()`, is implemented by `dbGetQueryArrow()`, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQueryArrow()` to create a result set object of class DBIResultArrow. 2. Optionally, bind query parameters with `dbBindArrow()` or `dbBind()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Use `dbFetchArrow()` to get a data stream. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An attempt to fetch from a closed result set raises an error. ### Specification Fetching multi-row queries with one or more columns by default returns the entire result. The object returned by `dbFetchArrow()` can also be passed to `nanoarrow::as_nanoarrow_array_stream()` to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") as.data.frame(dbFetchArrow(rs)) dbClearResult(rs) dbDisconnect(con) ``` ## Fetch the next batch of records from a previously executed query as an Arrow object This section describes the behavior of the following method: ``` r dbFetchArrowChunk(res, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) Fetch the next chunk of the result set and return it as an Arrow object. The chunk size is implementation-specific. Use `dbFetchArrow()` to fetch all results. ### Arguments | | | |----|----| | `res` | An object inheriting from DBIResultArrow, created by `dbSendQueryArrow()`. | | `...` | Other arguments passed on to methods. | ### Value `dbFetchArrowChunk()` always returns an object coercible to a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. ### The data retrieval flow for Arrow streams This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of `dbBindArrow()` or `dbBind()`, is implemented by `dbGetQueryArrow()`, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by `dbConnect()`. See also `vignette("dbi-advanced")` for a walkthrough. 1. Use `dbSendQueryArrow()` to create a result set object of class DBIResultArrow. 2. Optionally, bind query parameters with `dbBindArrow()` or `dbBind()`. This is required only if the query contains placeholders such as `�?�` or `�\$1�`, depending on the database backend. 3. Use `dbFetchArrow()` to get a data stream. 4. Repeat the last two steps as necessary. 5. Use `dbClearResult()` to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use `on.exit()` or `withr::defer()` to ensure that this step is always executed. ### Failure modes An attempt to fetch from a closed result set raises an error. ### Specification Fetching multi-row queries with one or more columns returns the next chunk. The size of the chunk is implementation-specific. The object returned by `dbFetchArrowChunk()` can also be passed to `nanoarrow::as_nanoarrow_array()` to create a nanoarrow array object. The chunk size is implementation-specific. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") dbHasCompleted(rs) as.data.frame(dbFetchArrowChunk(rs)) dbHasCompleted(rs) as.data.frame(dbFetchArrowChunk(rs)) dbClearResult(rs) dbDisconnect(con) ``` ## Retrieve results from a query as an Arrow object This section describes the behavior of the following method: ``` r dbGetQueryArrow(conn, statement, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) Returns the result of a query as an Arrow object. `dbGetQueryArrow()` comes with a default implementation (which should work with most backends) that calls `dbSendQueryArrow()`, then `dbFetchArrow()`, ensuring that the result is always freed by `dbClearResult()`. For passing query parameters, see `dbSendQueryArrow()`, in particular the "The data retrieval flow for Arrow streams" section. For retrieving results as a data frame, see `dbGetQuery()`. ### Arguments | | | |-------------|-------------------------------------------------------| | `conn` | A DBIConnection object, as returned by `dbConnect()`. | | `statement` | a character string containing SQL. | | `...` | Other parameters passed on to methods. | ### Additional arguments The following arguments are not part of the `dbGetQueryArrow()` generic (to improve compatibility across backends) but are part of the DBI specification: - `params` (default: `NULL`) - `immediate` (default: `NULL`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. The `param` argument allows passing query parameters, see `dbBind()` for details. ### Specification for the `immediate` argument The `immediate` argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing `immediate = TRUE` leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default `NULL` means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct `immediate` argument. Examples for possible behaviors: 1. DBI backend defaults to `immediate = TRUE` internally 1. A query without parameters is passed: query is executed 2. A query with parameters is passed: 1. `params` not given: rejected immediately by the database because of a syntax error in the query, the backend tries `immediate = FALSE` (and gives a message) 2. `params` given: query is executed using `immediate = FALSE` 2. DBI backend defaults to `immediate = FALSE` internally 1. A query without parameters is passed: 1. simple query: query is executed 2. "special" query (such as setting a config options): fails, the backend tries `immediate = TRUE` (and gives a message) 2. A query with parameters is passed: 1. `params` not given: waiting for parameters via `dbBind()` 2. `params` given: query is executed ### Details This method is for `SELECT` queries only (incl. other SQL statements that return a `SELECT`-alike result, e.g., execution of a stored procedure or data manipulation queries like `�INSERT INTO ... RETURNING ...�`). To execute a stored procedure that does not return a result set, use `dbExecute()`. Some backends may support data manipulation statements through this method. However, callers are strongly advised to use `dbExecute()` for data manipulation statements. ### Value `dbGetQueryArrow()` always returns an object coercible to a data.frame, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. ### Implementation notes Subclasses should override this method only if they provide some sort of performance optimization. ### Failure modes An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-`NA` string. The object returned by `dbGetQueryArrow()` can also be passed to `nanoarrow::as_nanoarrow_array_stream()` to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific. ### Examples ``` r # Retrieve data as arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbGetQueryArrow(con, "SELECT * FROM mtcars") dbDisconnect(con) ``` ## Read database tables as Arrow objects This section describes the behavior of the following method: ``` r dbReadTableArrow(conn, name, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) Reads a database table as an Arrow object. Use `dbReadTable()` instead to obtain a data frame. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

...

Other parameters passed on to methods.

### Details This function returns an Arrow object. Convert it to a data frame with `as.data.frame()` or use `dbReadTable()` to obtain a data frame. ### Value `dbReadTableArrow()` returns an Arrow object that contains the complete data from the remote table, effectively the result of calling `dbGetQueryArrow()` with `�SELECT * FROM �`. An empty table is returned as an Arrow object with zero rows. ### Failure modes An error is raised if the table does not exist. An error is raised when calling this method for a closed or invalid connection. An error is raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbReadTableArrow()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done ### Examples ``` r # Read data as Arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:10, ]) dbReadTableArrow(con, "mtcars") dbDisconnect(con) ``` ## Copy Arrow objects to database tables This section describes the behavior of the following method: ``` r dbWriteTableArrow(conn, name, value, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) Writes, overwrites or appends an Arrow object to a database table. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

value

An nanoarray stream, or an object coercible to a nanoarray stream with nanoarrow::as_nanoarrow_array_stream().

...

Other parameters passed on to methods.

### Additional arguments The following arguments are not part of the `dbWriteTableArrow()` generic (to improve compatibility across backends) but are part of the DBI specification: - `overwrite` (default: `FALSE`) - `append` (default: `FALSE`) - `temporary` (default: `FALSE`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbWriteTableArrow()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done The `value` argument must be a data frame with a subset of the columns of the existing table if `append = TRUE`. The order of the columns does not matter with `append = TRUE`. If the `overwrite` argument is `TRUE`, an existing table of the same name will be overwritten. This argument doesn't change behavior if the table does not exist yet. If the `append` argument is `TRUE`, the rows in an existing table are preserved, and the new data are appended. If the table doesn't exist yet, it is created. If the `temporary` argument is `TRUE`, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with `dbReadTable()`: - integer - numeric (the behavior for `Inf` and `NaN` is not specified) - logical - `NA` as NULL - 64-bit values (using `"bigint"` as field type); the result can be - converted to a numeric, which may lose precision, - converted a character vector, which gives the full decimal representation - written to another table and read again unchanged - character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string - factor (possibly returned as character) - objects of type blob::blob (if supported by the database) - date (if supported by the database; returned as `Date`), also for dates prior to 1970 or 1900 or after 2038 - time (if supported by the database; returned as objects that inherit from `difftime`) - timestamp (if supported by the database; returned as `POSIXct` respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) Mixing column types in the same table is supported. ### Details This function expects an Arrow object. Convert a data frame to an Arrow object with `nanoarrow::as_nanoarrow_array_stream()` or use `dbWriteTable()` to write a data frame. This function is useful if you want to create and load a table at the same time. Use `dbAppendTableArrow()` for appending data to an existing table, `dbCreateTableArrow()` for creating a table and specifying field types, and `dbRemoveTable()` for overwriting tables. ### Value `dbWriteTableArrow()` returns `TRUE`, invisibly. ### Failure modes If the table exists, and both `append` and `overwrite` arguments are unset, or `append = TRUE` and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Invalid values for the additional arguments `overwrite`, `append`, and `temporary` (non-scalars, unsupported data types, `NA`, incompatible values, incompatible columns) also raise an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTableArrow(con, "mtcars", nanoarrow::as_nanoarrow_array_stream(mtcars[1:5, ])) dbReadTable(con, "mtcars") dbDisconnect(con) ``` ## Create a table in the database based on an Arrow object This section describes the behavior of the following method: ``` r dbCreateTableArrow(conn, name, value, ..., temporary = FALSE) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) The default `dbCreateTableArrow()` method determines the R data types of the Arrow schema associated with the Arrow object, and calls `dbCreateTable()`. Backends that implement `dbAppendTableArrow()` should typically also implement this generic. Use `dbCreateTable()` to create a table from the column types as defined in a data frame. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

value

An object for which a schema can be determined via nanoarrow::infer_nanoarrow_schema().

...

Other parameters passed on to methods.

temporary

If TRUE, will generate a temporary table.

### Additional arguments The following arguments are not part of the `dbCreateTableArrow()` generic (to improve compatibility across backends) but are part of the DBI specification: - `temporary` (default: `FALSE`) They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. ### Specification The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbCreateTableArrow()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done The `value` argument can be: - a data frame, - a nanoarrow array - a nanoarrow array stream (which will still contain the data after the call) - a nanoarrow schema If the `temporary` argument is `TRUE`, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers. ### Value `dbCreateTableArrow()` returns `TRUE`, invisibly. ### Failure modes If the table exists, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. Invalid values for the `temporary` argument (non-scalars, unsupported data types, `NA`, incompatible values, duplicate names) also raise an error. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") ptype <- data.frame(a = numeric()) dbCreateTableArrow(con, "df", nanoarrow::infer_nanoarrow_schema(ptype)) dbReadTable(con, "df") dbDisconnect(con) ``` ## Insert rows into a table from an Arrow stream This section describes the behavior of the following method: ``` r dbAppendTableArrow(conn, name, value, ...) ``` ### Description [![\[Experimental\]](https://dbi.r-dbi.org/reference/figures/lifecycle-experimental.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) The `dbAppendTableArrow()` method assumes that the table has been created beforehand, e.g. with `dbCreateTableArrow()`. The default implementation calls `dbAppendTable()` for each chunk of the stream. Use `dbAppendTable()` to append data from a data.frame. ### Arguments
conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. "table_name",

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = "my_schema", table = "table_name")

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL('"my_schema"."table_name"')

value

An object coercible with nanoarrow::as_nanoarrow_array_stream().

...

Other parameters passed on to methods.

### Value `dbAppendTableArrow()` returns a scalar numeric. ### Failure modes If the table does not exist, or the new data in `values` is not a data frame or has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if `name` cannot be processed with `dbQuoteIdentifier()` or if this results in a non-scalar. ### Specification SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with `dbReadTable()`: - integer - numeric (the behavior for `Inf` and `NaN` is not specified) - logical - `NA` as NULL - 64-bit values (using `"bigint"` as field type); the result can be - converted to a numeric, which may lose precision, - converted a character vector, which gives the full decimal representation - written to another table and read again unchanged - character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings) - factor (possibly returned as character) - objects of type blob::blob (if supported by the database) - date (if supported by the database; returned as `Date`) also for dates prior to 1970 or 1900 or after 2038 - time (if supported by the database; returned as objects that inherit from `difftime`) - timestamp (if supported by the database; returned as `POSIXct` respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) Mixing column types in the same table is supported. The `name` argument is processed as follows, to support databases that allow non-syntactic names for their objects: - If an unquoted table name as string: `dbAppendTableArrow()` will do the quoting, perhaps by calling `dbQuoteIdentifier(conn, x = name)` - If the result of a call to `dbQuoteIdentifier()`: no more quoting is done to support databases that allow non-syntactic names for their objects: The `value` argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter. ### Examples ``` r con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTableArrow(con, "iris", iris[0, ]) dbAppendTableArrow(con, "iris", iris[1:5, ]) dbReadTable(con, "iris") dbDisconnect(con) ``` DBI/vignettes/spec.Rmd0000644000176200001440000000177114607456777014313 0ustar liggesusers--- title: "DBI specification" author: "Kirill Müller" output: rmarkdown::html_vignette abstract: > The DBI package defines the generic DataBase Interface for R. The connection to individual DBMS is provided by other packages that import DBI (so-called *DBI backends*). This document formalizes the behavior expected by the methods declared in DBI and implemented by the individual backends. To ensure maximum portability and exchangeability, and to reduce the effort for implementing a new DBI backend, the DBItest package defines a comprehensive set of test cases that test conformance to the DBI specification. This document is derived from comments in the test definitions of the DBItest package. Any extensions or updates to the tests will be reflected in this document. vignette: > %\VignetteIndexEntry{DBI specification} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo = FALSE} knitr::asis_output(paste(readLines("spec.md"), collapse = "\n")) ``` DBI/vignettes/hierarchy.png0000644000176200001440000022345514350241735015363 0ustar liggesusers‰PNG  IHDRJ§PÂwFiCCPICC Profile(‘c``RH,(Èa``ÈÍ+) rwRˆˆŒR`¿ÏÀÄ ÉÀÏÀÀ œ˜\\ààÀ|»ÆÀ¢/ë‚Ì­+àJI-NÒ€8;¹ ¨„��1doyIˆÝd‹$eƒÙ @ì" �ì- v:„}¬¾Vä d²ù’Àl&�]|鶈 µSò“R@¾×0´´´Ð$ÑAIjE ˆvÎ/¨,ÊLÏ(Qp†Tª‚g^²žŽ‚‘�¡)(Ü!ª?‚ÓQì B bs$ü—20°üAˆ™ô20,Ða`àŸŠS3d`Ðg`Ø7'¹´¨ j #“1!>°CI•ã pHYsgŸÒR@IDATxìÝ |”Õ¹øñHH‚&ìˆ  hPˆTIØe KÐÊõ Ô[µBé¿@?ØJQ[ÁÛ*P-Þ²¶ˆ€€I�€€„PH¢,��H Áüßs ÉÌdO&3óÎüÞÏgšYÞ÷œç|ufž9K�<ã@@@@@Àƒ¼<¸í4@—ذaƒÄÇÇ»tŒ‡ `�ÜÜ\ùóŸÿ,¾¾¾ö/œ@@ D¥%Òð €Î7nœL›6M¼½½�µ#€8Tà�ü£üâ¿�‰':´^*C@ÀÓH”zú¿Ú� à²uêÔ‘ˆˆiÔ¨‘ËÆH` €ö8uê”ý ¥D@(S f™gp € € € € àæ$Jݼƒi € € € €”-@¢´l#Î@@@@@7 QêæLó@@@@@ l¥eq € € € €¸¹‰R7ï`š‡ € € € €e �(-Ûˆ3@@@@@ÀÍH”ºyÓ<@@@@([€DiÙFœ� € € € €n.@¢ÔÍ;˜æ!€ € € € €@Ù$JË6â @@@@ps¥nÞÁ4@@@@Ê QZ¶g € € € € €€› �(uó¦y € € € € P¶‰Ò²�8@@@@Ü\€D©›w0ÍC@@@@�²H”–mÄ € € € € àæ$Jݼƒi € € € €”-@¢´l#Î@@@@@7 QêæLó@@@@@ l¥eq € € € €¸¹‰R7ï`š‡ € € € €e �(-Ûˆ3@@@@@ÀÍH”ºyÓ<@@@@([€DiÙFœ� € € € €n.àåæí£y €6l˜´iÓ¦Ôï¼óN™>}z©çð" € € €Ž QêhqêCÜXà‡~ÿR[xíÚµR_çE@ ¢™éé’k\äå__üùt[Q>ÎG@¸-ÀGIþ) €ØMà믿¶[Y„î&�+©)Irö²ˆ··Ñ¶œñnØZ‚ZÖ¯RCO~ú;i>ëV¡såbÜD©Z‰U ‡‹@@L,@¢ÔÄ�Gè € €€sr%=íœäzù‹Wn¦ñ·�4®ï[lHé{þ*Í;O±~-ØHl¬Zbó™#…eÆÇÉÑ̉ҩô�í…ç;é^fjŠü˜‘#~ [IËÆÅ{9)4ªE@Õ›,©§}#ä`Þ9™nq’îv¿\N$%Jbb¢œ¸øw 4Ý0µ  € €€+˜î£¤+  € PÿàQ»$[Þ=Å[™ËÌ…Ó$ðúw²òãy«!—"Óû¿"=.®“nÆÚŸƒþ°]f7ú‹L™Sxõ˜™ %¼Ý�rãÆIùr�L_Pøšªá£-G$*($¿2ñí%»£}dOj†øøøÈÉMÈ,‹JçΖþ-}åº1ð±Y§p ±XBsϯ˜‚’nÝ 3[ÞûõSâ}õ´,~5RXÄŸ8+\>ˆ¸(Cò·Wò«4ms5çÚºr¨Ä† €¸ƒ@1«�Z<•¶©Œ»Øª¡Á3‡IàíOmÞÞeOl·=%@,*°*YÄö\ïâ3²õomœ”¿|§È™¿ò×ò^T‹�µ<ßmñXÝ}@šd>½¥vÁ}ã¥øuòMÚD ³ìš¾÷ «5JÅØûÝ»äðmê*ùa݆­­^ �=KæOîdõ\Áƒì4Ù¿÷�Ƚ�IKåîW×HU[1òÏõÉÒ)*ÈòÉ[÷�k>[#»¾ó‘á¿z^-Û[ôlãÛ�ãÙr2ù˜‘Ü¡e‘W‹-‚'@@ì"À®÷va¤@@ |iÉÛd�ÅÀL‘ I4’rû>•·Ç‡I“Ž£m6g –7Ÿër«ðÜtÙýžUE'¿=&'SR$99Yöïù\ÞÿÝcwöÂѤêdëLcZÊ!Ù³g�:´_>}Ï:)›¼ï+9´¿ñú~IIËßóÝHç5ë'ïMµÞÙ}Îè`ÿþç’š™-™iÉ2ü“2z�Ux2)fü­d£1v4ÕhûGVÕÅKÏ^¯JÂÉtã"ãu#I<¼{áfHº$czþÅÏr·®¨ŒG-»†Óí �ø)�eü|{þ˜Ö\IO=$Kß/5üšHÇî=¥c«gå�"ðj)}'Y^m¤‰G·“W?I�ôÛDÙé©’°ê} 3®í9A¦L+¯/5’­e¯üfŽì9™*©)F_ÌSÂjøI«vÁÒ1¸•üÏÒ”2®æe@@{ ÔÈ3{HY € `�¶mÛÊ®]»¤Q£Fö)�Rœ.�yh¾O¨Pc&Ê¢çÕ¨ÍlY:ÄOF[%YËWTôñ,‰¼•mÌNY*~mlG}–TÎ8IÊ™_8½>}� iÐÙr~IÞz>t®œ‹›(jÀhúž·¥Ag›$héWëW&eÈóK wA¦|2$@Ææ»„ΓŒ¸ñÆ8ԢǞ÷‡l´dùjpp¨Hb¼M‚Z�.û2Ö»Þw+Úvã’1K’d‘ͨÓlc3'¿vcUáe¡³wK\I£^˼šÌ,0cÆ iذ¡Lœ8ÑÌÍ v@L'ÀˆRÓu#€ €€ir®W(ô1s·ËB�$U—eIfF….×'OŠN*H’ª'r.Ÿ¯@!Çä²Å®ðR¿“,?±Io¶Tf!¡3åøÆ[IRuîOƨ׊“–$–‘$­X‰�&.”è©FRÔæH,6Ij$:çM½•$Uçm_”m¬lZÎ#t¶üaXÑ©ù¾Adn¹ •—†?PÎÊ8 @@À$Jí¡H € €@9üš¶—1¥�,¡ácdêÜ%²ïD†,šØÍb�ÊúòØs“J»ºà55Br̤Ù›tNÞ‹°NÖù· •br…×ZÞ �ô’<`34Ó·e?Y—uB–L-¹%Sn7FuN“ÛƒXu‘mžZ$Á:iî\g=£ýVõ¡“dSÒE›õO-#«ìýúñVœü¸/F&…Wñ­rÃÇÍ”M‰?Ê¢ñÖk˜úEH\Ö�3·ä~' 7퓬¸ÉVí/Œ¸±LÜxBN /|Êò^p¸Ìœ·INdÄ n|Ëó¸� € `w¦ÞÛ�”@°�SïíãH)Õ'�k¬Ë™ôýi¹dì_ۨƻN#iÝ6Pêßšå_Ίs%-õ¤\ÈPÛÈû&Ü%-›Õ/çµÆi¹‡äYïà  Œ©÷�©÷å)!ÓˆÿÇŸ.…ÜZÃÕ/ ¡4hÒXüm÷W*.šÜLIýñœŽ[o6el‚Õ°É]ÒØ¿�ÏΔ´‹™r-Çh»QH€©_‘ë‹‹‹çÜB€©÷nÑ�4@À„åùhÂf2 € €@u xÕo&Œ[Õ/iÜ,и•]JZr‚ì:zUî¬ßDšÝÛTzgÈšw^)L’ª"|,Fá–^¦¿{Peã÷ò—f-�[éU”þª¯¿ÑnF�–ŽÄ« € €€ãH”:Κš@@*+�½_^l×½Ì�¤f¿> Ø�œ*[-×!€ €xŽk”zN_ÓR@@À¼Æìô²ö² ž-¿êÖØ¼m$r@@§ �(u*?•#€ €”KÀ?XÞ]2SB‹Ùƒ)8|’Dï>!ß‹`4i¹09 @@ 8¦Þ§Âs € €.&à%!QÓ$θeggKŽÚIÆ&Jþ¾|¤½…Áÿ"€ €TE€O•UÑãZ@@‡ øúúŠºq € € `O¦ÞÛS“²@@@@@À”$JMÙm� € € € €ö QjOMÊB@@@@S �(5e·4 € € € €ØS€D©=5) @@@@L)@¢Ô”ÝFÐ € € € € `O¥öÔ¤,@@@@0¥‰RSvA#€ € € € €€=H”ÚS“²@@@@@À”$JMÙm� € € € €ö QjOMÊB@@@@S �(5e·4 € € € €ØS€D©=5) @@@@L)@¢Ô”ÝFÐ € € € € `O¥öÔ¤,@@@@0¥‰RSvA#€ € € € €€=H”ÚS“²@@@@@À”$JMÙm� € € € €ö QjOMÊB@@@@S �(5e·4 € € € €ØSÀËž…Q €ØOàøñã2yòdiР�ý ¥$@—˜3gŽÌ›7Ïåã$@@ÜM Fžq¸[£h €î �œœ,;wît‡¦Ð@� x{{ËsÏ=W�+8@ì!@¢ÔŠ”� € € € €¦`�RSwÁ#€ € € € €€=H”ÚC‘2@@@@@ÀÔ$JMÝ}� € € € €ö QjEÊ@@@@@S �(5u÷< € € € €ØC€D©=)@@@@L-@¢ÔÔÝG𠀘WàÌ™3æ žÈ@ÀçÏŸ7Eœ‰ €®!@¢Ô5ú�(@ð�k׮ɲeËdРAò /xD›idÙ[·n•�>ú¨ì9� ôë×O,‹-’ŒŒŒ ^Íé € ài$J=­Çi/ €Nؽ{·¼üòËòÀÈúõëe„ ú¯B¡J8}ú´$%%¹`d„dv�]»vÉøñã%66VÚ·o/cÆŒ‘uëÖIvv¶Ù›Fü € P 5òŒ£Ê¥H@ðp�ÔÔT=ztÉ’%âãã#£G�–‘#GJãÆ�=\†æÛ üóŸÿ”ÇË_þòÛ—xŒ€Ý®\¹¢ Yµj•ìÛ·OÔhÓˆˆ •ZµjÙ­ B@ó �(5oß9 €.'pýúuÙ°aƒ¨äèþýûeøðá:AúÈ#�¸\¬ä:$J]§/<%µvéÚµkE%MSRRdèС)�?þ¸§ÐN@(F€Di1(<… €øæ›otrtÍš5¢’¢jôèÀ�¥víÚ+ˆ³=R€D©Gv»Ë4Z-ý­ojeõ�iª– á@@Ïðò¬æÒZ@°—@ZZš¬X±B'HÕHR•ݱc‡4kÖÌ^UP Pí-Z´�×^{MßÔj”é3Ï<#wÞy§N˜ª‘¦ê@p¥îßÇ´@» äææÊæÍ›urô«¯¾Ò»×¿÷Þ{Ò¹sg»ÕAA €€³|ðAQ·3fÈž={tÒT­a¨“¦jŠ~£F�œõ"€ €@5 0õ¾š�)@wP£¬Ôº£+W®”víÚITT” 2DüüüÜ¡y´ÁÉL½wrP}©7oÞ”øøx�4ýüóÏåÑGÕISµ¼ˆuÊ� €î#ÀˆR÷éKZ‚ €€].]º¤£*AzñâE��‹‹“{ï½×®õP àʵjÕ’^½zé[vv¶lÚ´I'M'Ož,aaaz¨>}úˆ···+7ƒØ@@ Œ(-§ € à)?ÿü³ÄÆÆêÑ£jU¿~ýôڣݻw÷ÚéF”:�*«,�‘‘!111z¨ÄÄD½‰ZÏ´[·nR£F�*—O € àx¥Ž7§F@\Nàøñã:9ºlÙ2=bTmÌ4lØ0ñ÷÷w¹X ÈýH”º_ŸzZ‹Îž=+kÖ¬ÑIÓ3gÎèÿ~ª¤é#�<âi´@S 0õÞÔÝGð €T^ 33S±WSëO�:¥wyþì³Ï¤M›6•/”+@hÚ´©¼ôÒKú–’’¢§æ¿øâ‹¢Fé«„©ºñßVü‡A“@L'ÀˆRÓu#€ P5�íÛ·ëÑ£jSµ›³=Ú³gO©Y³fÕ æj*)ÀˆÒJÂq™Ë >>!`J¥¦ì6‚v�@rr²e-~~~z”©Jš¶lÙÒAP  €ž#ÀbežÓ×´@ÀÄiii²råJ� ÍÎÎÖÉQµƒr³fÍLÜ*BG(K ((H~ÿûßëÛÞ½{uÒ´W¯^:Qª¦æ>œeVÊBäu@Ê)ÀˆÒrBq €ŽÈÍ͕͛7ëäèW_}%Ô Ò.]º8:êC ZQZ­¼î†?ÿü³|ùå—:iª6ƒzä‘GD�2UïnØbš„ €€cH”:Æ™Z@(·ÀáÇurT� m×®�DEEéM=êÔ©Sî283 �(5So«« \¿~]ÿ¨¦¦æoß¾]žzê)�4íÓ§K²¸Zg €€Ë 0õÞ廈@|¸žQ§N˜@ðF”zLWÓP@�êÈÊÊ’˜˜�MJJ’#FÈòåËåÁ¬Îj)@�* xyyé¥aÔò0×®]“�7ÊêÕ«å7¿ù�ôîÝ[�4UÕy €¸³#Jݹwi €@µ ¨õÞ/^,ëׯ—.]ºèÑ£ýúõãËdµËS�; 0¢Ô�z“¶¸“À¥K—dݺuzzþáÇ%<<\Ï�èÚµ«Ô¨QÃ�šJ[@Ð$Jù‡€ €@RSSõhQµö¨···Œ3FFŽ)�7®`IœŽJ€D)ÿp}õÞ§F™FGGËùóçEm¥fO»~ðDˆ €@9H”–ŠÓ@<[àÆ�²aÃ=µ~ÿþý2tèP=z4$$ijah=v QjDŠ@À�ÇŽÓ£LW®\©gPDDDè¤iëÖ­U!€ `¥ö7¥D@78pà€žZ¿fÍyøá‡urtàÀ�âãããF­¤)8W€D©sý©�ª¨Õ&PêvÏ=÷è©ùj´é]wÝU•b¹@§°·SØ©@À•ÒÒÒD�’QSëÕ&Mjj}BB‚4oÞÜ•Ã&6@. fV¨ÛŸþô'Ù¾}»žš?{öl=%?22R¯kàð¸¨@�Ê0¢´2j\ƒ àv¹¹¹²eË�ݹs§¨Q££G�Ö4¹]ci.&ÀˆRëÂA Šj¹š­[·ê¤i\\œtïÞ]Ôô|µÙ¡¯¯oKçr@ªO€¥ÕgKÉ €&8r䈞Z¯6§¸ÿþûurôÿø‡Ô©SÇÑ" €®'P»vm0`€¾]¹rEÖ¯_/‹-’I“&IÿþýuÒ´G�R«V-× žˆ@}úèéSO=å&-¤˜W€D©yûŽÈ¨¬ÀéÓ§õ�–jFÇÕ«Wõ(S5=ÿ�¨l‘\‡ €@•H”V™�@\Yàøñã:9º|ùr½¯=ªvãec Wî5bó4¥žÖã´k�ÇëQ¦«W¯ÿ‚¤i‹-¬Oä €Õ,À¥Õ Lñ €ŽÈÌÌ”µk×êéÉ“'å™gž‘O?ýTÚ¶mëø`¨@JxðÁEÝf̘!»wïÖIÓÐÐP ÔISõgÆ K-ƒ@°‡#Jí¡H €.!��� “£Ÿþ¹¨)õjôh¯^½¤fÍš.A €@ñŒ(-Þ…gðd�›7oê¥rÔz¦›6m’Ç{L'M(wÞy§'ÓÐv@�j`Di5âR4 €@õ œ:uJ–.]ªoõêÕÓÉÑY³fIýúõ«¿rj@@�j¨U«–þ±Sýà™��­“¥*i:eÊ ÓISµÞ¸··wµÔO¡ €ž)ÀÏìwZ�˜Z ++KÔš£ƒ Ò_–222t¢tûöí2~üx’¤¦î]‚G@ÀZÀ××W†ªg�$&&Šš–?þ|½¤ÎË/¿,êý?//Ïú"!€ P F”V�K@œ#°gÏý%I­7Ú¥K�íׯŸxyñv朡V@+P·n]yî¹çôíìÙ³²fͽ¶é™3gôf�‘‘‘òÈ#�86(jCp¾YºMWÒ@À=ÔŸeË–é£*!ªÖÝ»w¯4nÜØ=L«@@ \M›6•—^zIßRRRô&P/¾ø¢]!*iÚ¦M›r•ÅI €(6sâß €€Ë ܸqC6lØ G�îÛ·O�‰ŠŠ’Ž;º\¬„U`3§ªR 8p@'MW¯^-Mš4Ñ ÓáÇËÝwß]x÷@(F€¥Å ð €€sÔ›%K–ˆúbóðÃëÑ£ê±���s¢V@0�€ú ¡no¾ù¦ìܹS¢££¥k×®Ò¾}{½ Txx¸¨ 9@°`D©­�@*pþüyY±b…žZíÚ5�5j”4oÞÜ¡qP8O€¥Î³§f}Z¯“þÆoÈ¥K—Dm©×6-‰œ‰ `fF”š¹÷ˆpQ�ŸþYâââôèQõWMiS»Ö?õÔSR£F �š°@ÀYŒ(u–<õ"€@IÉÉÉz”©ÚJ­aªF™ª¤)?ô–$Æó €€{�(u�~¤ €€K?~\�]¶l™ÜsÏ=zjý°aÃ$ À%â#pM¥®Ù/D…·öîÝ«“¦kÖ¬‘V­Z餩ú|Ó¸qcˆ@ÜL ¦›µ‡æ €8XàÊ•+ò¯ýKúõë§7eºyó¦|úé§zgÙ矞$©ƒûƒê@@À¾�=ö˜Ìž=[¾ýö[™:uª>>Å]Îs €&`ê½ :‰@W8uꔨiõK–,‘zõêé©õ#FŒ�úõë»JˆÄ�&`ê½ ;��@ @ ##CÖ¯_¯“¦�èéùjmv~@.`â ` ¥¦è&‚Dœ'�••%111zjÙ‘#GôF£G�fXçu 5#àv$JÝ®Ki+pîÜ9Qk™®ZµJÔÌj-S5Ò´cÇŽkBÃ@3 �(5So+ à@�={öè‘£j½Ñ.]ºè]ëû÷ï/^^¬ÚâÀn *|XÂÃÃõFPê³[�5<Ò„F#€Ž Qê(iêA,päÈ=rtÅŠzý«¨¨(2dS¹ÜT‡e �(-Ûˆ3@À3RSSõ2IÑÑÑráÂQ›AEFFJpp°g‚Ðj@ š˜z_ÍÀ�8RàòåËzGUµö¨šf?jÔ(½öUË–-u!€ €ØA Y³fòòË/ëÛÑ£Gõ(Ó_þò—z:~DD„Œ1BZ·nm‡š(@@ 0¢” €€Éòòòt2téÒ¥úoŸ>}ôÔú§žzŠéY&ï[ÂGÀSQê)=M;@À^û÷ï×IÓU«VÉ=÷Ü£G™ªÑ¦wÝu—½ª @À#H”zd·Óhp�ãÇ�ëuGU‚´E‹z×úáÇK@@€;4�6 €€ �(õ Î¦© `WõƒùöíÛõŒ¢Ï>ûLzè!�4�2dˆÔ©SÇec&0@ÀUH”ºJO P1�””½ ”šE¥5Ê4""BoU±’8p ¦Þ»F?˜P@MAR¿¤«�™ÒÒÒdÔ¨Q²uëViÕª• [CÈ € €TL 00P¦L™¢oП�Õ´ü&Mšè¤éðáÃåî»ï®X¡œ�8Q€D©ñ©Ì'�——§wUÉÑØØXéÓ§�̘1Cžzê)Ög2_w1 € €€�ÔÔ{uûãÿ(;wîÔISµüTûöíõ(Óððp©W¯ž�j£@ z˜z_=®”Šn& ¦©uGÕMmƤ6fR¿�¸YKi àx¦Þ;Þœ@GäääèW«V­Òƒ žxâ �4íß¿¿øùù9"ê@*$ÀˆÒ qq2x’À•+WdíÚµzjý÷ß/#GŽÔ»}ª5H9@@@ toooyúé§õíêÕ«òÙgŸÉ²eËäÕW_•¾}ûê¤iÏž=¥V­Z¥Ä« €€ƒQê hªAó¨ÝêÕÔú�7ê)õjôhïÞ½¥fÍšæi‘"€&`D©‰:‹P@;\¼xQHP#M�=*jTµ T—.]ìP:E €• QZy;®D78}útÁÔúºuëJTT”AZ¿~}7j%MA\S€D©kö Q!€ŽPŸÃW¯^-*iª6KUË[©¤©ZÛ”p´Ã£-N} à2YYY²bÅ <<\ß222dýúõòñÇËË/¿, •4íÞ½»¨ä* P¥•Qãp9� .èÅßÕèÑ«W¯ê]ë¤yóæ.+!€ € €@Õô€µ¤Ö¹sçdÍš5òæ›oÊéÓ§E­eª’¦;v¬Z%\�'ÀfN×å4÷¸yó¦lÞ¼Y–.]**):pà@� }â‰'ܧ‘´ð6sò€N¦‰ €€ƒNœ8!ÑÑÑú¦–âR Su»ï¾ûÕ €€™H”š¹÷ˆHJJÒSëW¬X¡?ð¨_‘‡ "uêÔñPš�˜[€D©¹û�è@W8tè�N˜ª%¹5j¤7�>|8³Î\µÃˆ `ê½ t! €@Ù—/_Ö‹¶«©õjjͨQ£dëÖ­ÒªU«²/æ @@ð8�:ˆºÍœ9SvîÜ©¿OtëÖM‚‚‚tÒTmöZ¿~}�s¡Á P²#JK¶áp²@^^žÄÅÅéÑ£±±±Ò»wo½Q�=¤F�NŽŽê@ì%ÀˆR{IR €@Y¹¹¹¢¾[¨Q¦[¶l‘Î�;ë¤©Ú Šjeéñ:î/ÀˆR÷ïcZˆ€éRRRôº£jíQµ“šZ?gÎQ ¶s € € €•ðòò’¾}ûêÛµk×dãÆ�:iú›ßüF̈ˆˆ�^½z‰:�]0µ¾nݺ%#GŽd!uèB@œ!@¢ÔêÔ‰ P�£G�ê©ùÑÑÑâíí­G ª¤iëÖ­Ës9ç €€É˜zo²#\Ì*���-+W®”ððp •ôôt=Õ~ûöí2aÂ’¤fíXâF@@À�î»ï>ùÝï~'ß|ó�|øá‡ú{ŒZã4,,L?>wž¦!àyŒ(õ¼>§Å8Tà믿ÖSëÕz£�:uÒSëÕ:¤ê×X@”#Jùw€ `&�¼¼Ô(ÓÏ>ûLzè!=5ðàÁì­`¦Ž$VŠ QZ O!€@ÕΞ=«D_²d‰Ô¬YS'GŸyæiÒ¤IÕ æj@· Qê–ÝJ£@�¸qã†lÙ²E'M·mÛ&ݺuÓÓóÕà�0 ‘¸“€—;5†¶ €€óÔ„M›6éÑ£{÷î•!C†è©(�>ú¨ó‚¢f@@@ j×®-Ô·ÌÌL=ÂtÑ¢EòÊ+¯ÈÓO?­“¦jé15€„\_€¥®ßGDˆ€K !!Aš7oîÞ §u € € €@95j$ãÆ�Ó·S§Né©ùj”éµk×døðázMÓvíÚ•£$NAG 0¢Ô‘ÚÔ…€‰nÞ¼©×ÞQÉÑ;vÈ€t‚ô‰'ž0q«@ÀQê ½@  €ŽøÏþ#«W¯Ö#Mô(ÓˆˆiÑ¢…#ª§(C€¥eñ2ž.�œœ,‹/–+VHÛ¶mõÆLóçÏ—;î¸ÃÓih? € € P!�öíÛ‹ºÍ˜1CvïÞ­¦=zôÐßµTÂtèСҰaà •ÉÉ `?V¶Ÿ%%!à6—/_–�?þXÂÂÂô´???Ùºu«lܸQ'JI’ºMWÉé:@IDATÓ@@p’@çÎ�åÝwß•£G�Ê믿.jSÜ��=Êtùòåz™3'…Fµx¬#J=¶ëi8Öyyy¯7fŠ��•^½zÉ´iÓDýºY£F ë“y„ € € `�ZµjIïÞ½õ-;;[6mÚ¤GšNž A�’X£´d^AÀ#ÔŒjÝÑ¥K—J³fÍôˆQ5åC­—Ã� €€#X£ÔÊÔ� `65Ó/&&Fo¥Ö64h�Nš>ùä“ f1[g¯iQjš®"Pì'påÊY·n�N�ªDéÈ‘#õð}÷Ýg¿J( @@@ ÒuëÖ•çž{NßΜ9#k֬ѳþΞ=+Æ “#FÈÃ?\éò¹Š 0¢´¨ Ï à¶;wîÔÉQµÖh·nÝôèQ5…CMõà@@ÀYŒ(u–<õ"€˜Q %%EOÍ_¹r¥?22R¯kÚ¦M36‡˜p)¥.Õƒ€ýNŸ>­§Õ«©õj:ýèÑ£õ/� 4°e”ˆ €@%H”V�K@08 §æ«Ñ¦wÝu—žš¯F›Þ}÷Ýø €@%Øõ¾h\‚€« ¨ÀÕ¯‹áááz3¦ôôtY¼x±$$$È„ „$©«÷ ñ!€ € €e ¨©÷úÓŸäÈ‘#òæ›oÊ·ß~+]»vÕë™þßÿýŸ¨uNË:Ô÷ÇÏ>û¬¬Óx�`D©Gt3�ô�½{÷ê©õjýÑN�:éÑ£ýû÷gwDOù@;@“ 0¢Ô¤GØ €.)�““#[·nÕÓó¿øâ Q›?© {ÕwC??¿"1çååÉã�?.:t�wß}—�5E„x“QêI½M[ÝR@-ä=gÎyì±Çäþç¤uëÖ²gÏY±b… <˜$©[ö:�BÌ-�––&þóŸKlÄÂ… EíîË� €ðöö–§Ÿ~ZÔ‘IIIz¦á²eˤ]»v2~üxÙ²e‹Ü¼y³ à5jÈŽ;¤E‹Ò¹sg½ÑoÁ‹ÜAÀÃQêaNsÝCàÆ�²iÓ&=zT�"2dˆ=úè£�ºGi €€Û Üÿý¢F¹¨/e–#JÕ¨õ£ß¾}û¤aÆnï@@p”À… díÚµ²zõj9zô¨þ©FšvéÒ¥ „ýû÷˯~õ+ ’¿þõ¯¼ÈpÇSQê)=M;ÝB 11Q¦L™¢ T£mÔî†êÂ÷Þ{OH’ºEÓ@ÀcÔ4@5zÅöPïuÍš5ã‹™- �@¨¢€úò¿ÿû¿õ ›mÛ¶é+ßxã =åþøƒžÍ¢÷¶ Ô£KÕ&Qx’‰ROêmÚjJõ«ß‡~¨×•yî¹çôÇ/¿üRÔ:¤*QêëëkÊv4 €€g ””(UÉSõ €TŸ€šÑ1iÒ$ý£¥Ú¸V­Zz–¢]úþûïËóÏ?/ÑÑÑòÎ;ïȳÏ>+jÙ©“:‚j@>^�U;þöîÝ[�íÑ£‡Ô¨Q£´Ky @·PþûßÿÖĘ̈¥¿øÅ/ääÉ“òöÛo»Mi €f¸~ýºNŠª¤i~5?‰ª’¥gΜ‘£G�ꤪú^Ë�€» 0¢ÔÝz”ö8M@MGø¯ÿú/ý œú…Míh{|÷Ýw²téR}»ûî»urTíX`{*�@p{5¢tΜ9:Qª«6rR3+8@@À9>>>zMRµ.ii‡ÚWƒw QꎽJ›* ¦+Lœ8Q¯Ý¢¦Ñ«Ý?þøã‚D©z}íÚµzô¨J”Ž1B?Vë²q € àÉmÛ¶Õ?0^¼xQÔ¨”]»vÉßþö7O&¡í €˜B@}ïå@À˜zJ›& ¦ ªÄgþZ.ù7hÐ@V¯^-+W®Ô _wïÞ]�USìyCÉWâ/ €"/¼ð‚xyyɵk×$%%E¾úê+X@@pŠ@M§ÔJ¥˜\@M3˜9s¦ôêÕK¾ÿþ{=ƲI—.]’—^zI‚ƒƒå›o¾‘E‹I¿~ýH’Z"q@Cà‰'ž�'Nè5ÏÔT|@@œ%@¢ÔYòÔkZ•íÒ¥‹¼óÎ;rùòåbÛ¡vTkºL˜0AÔèR@(^@%GÕHÒ .‰Òâ�x@@À1L½wŒ3µ¸‰À'Ÿ|"¯½öšN�ªdhi‡¿¿¿;vLîºë®ÒNã5@<^ U«Vú½õøñãÒ°aC�÷@@À9Œ(uŽ;µšL@�r ——_~YÒÓÓ¥¬$©j^ff¦ÞÀÉdM%\@.ðÈ#�ˆú�‘$©Ãé©@@ÀB€]ï-0¸‹@q_|ñ…DEEÉùóçõ޼ùç¨�'êÔ©£7 Pk–æææJ£F�ô”ûÀÀ@i×®�üú׿Î?�¿ € P‚ÀèÑ£¥S§N%¼ÊÓ € €8F€©÷Žq¦“ ìÛ·O}ôQñööÖ·¦M›Ê½÷Þ+mÛ¶•   }_=Vë‘Þ}÷Ý&m%a#€ € € €�(åߥ¨5FÕöjí´Æ�—r&/!€ € € €˜Y€D©™{�Ø@@@@@À.lædF A@@@@3 �(5sï; € € € €ØE€D©])@@@@Ì,@¢Ô̽Gì € € € € `¥va¤@@@@0³‰R3÷±#€ € € € €€]H”Ú…‘B@@@@@ÀÌ^*øëׯËïÿ{ÉËË3s[ˆ@ÀB@ý·}Ú´iÒ¤I‹g¹ë 999òöÛoKzzº+„C  €.&�››+þóŸÅ×××Å"#¾;óop?ËïÎ5ŒähÞÇ,_~ù¥<õÔSî×ZZ„x¨À™3gäâÅ‹ò׿þÕC\·Ù[·nÕ_€£¢¢\7H"CpšÀ×_->ø Lœ8Ñi1Pqñ|w.Þ…g@3 X~wÖ#JUcÔˆ£^xÁÌí"v@ õAþÒ¥KÏpו6lÈû®+u± €.$pêÔ)ІPløîl+Âc@ÀÜ–ß�Y£ÔÜ}Iô € € € € `¥v@¤@@@@0·‰Rs÷Ñ#€ € € € €€H”Ú‘"@@@@@ÀÜ$JÍÝD� € € € €v QjDŠ@@@@@s �(5wÿ= € € € €ØA€D©)@@@@Ì-@¢ÔÜýGô € € € € `¥v@¤@@@@0·‰Rs÷Ñ#€ € € € €€H”Ú‘"@@@@@ÀÜ$JÍÝD� € € € €v QjDŠ@@@@@s �(5wÿ= € € € €ØA€D©)@@@@Ì-@¢ÔÜýGô € € € € `¥v@¤@@@@0·‰Rs÷Ñ#€ € € € €€H”Ú‘"@@@@@ÀÜ$JÍÝD� € € € €v QjDŠ@@@@@s �(5wÿ= € € € €ØA€D©)@@@@Ì-@¢ÔÜýGô € € € € `¥v@¤@@@@0·€—¹Ã'zŠ d¦§I®ÿ´ýêK}ߢ¯ó  € ๙’–©>µxIýúþ.A € €ž,@¢Ô“{ß Ûž�ü‰´{»eã$1k¾t Yê†=M“@0»@¶, £ßjǘ…I²èù ³7Šø@p‚@®¤&'ÉÙk"ÞÞùÕçHŽÔ•¶…Ÿ"óMø[¥åQâÓû2Ö"ÖŸäZŽñ�D©… w@ÜN 7[ÒÓ/J–x‹Ÿ—¯øùû‹¯þ„—+i©çÄ«A3fXعÓ3SSäÇŒñkØJZ6®ä�ì#²év’T…—™a|»ã@@� ¤ÅÍ’æ=§s]°ìÎ8(�Ê“)ÍM—”ã?IŽ·Ÿ´ lI¡MOyŠD©“{:åóùòö’ý"uŠR§NCipwSiñ‹û¤ãc�¤CËúEN:™ð‰¼µÀHÖ)¦uö5ãCw£òD/é×·»´ô/ÚåiûWÉ[ó·Ê5#ˆ’‹1Ê©(ã÷š„4¾]FfŠ|2ëm‰½P\øu¤aÃÒ´e ¹ï�ŽÒ©K©_´ê"í©ê9’iUDÁ�IVÏò@À“ªôÞ›{R–ÎzK6ýPÜ{ß-UõÖÛ¢CˆôêßOºwh©ƒ)rTú½×²¤ìTùtÁ;2í•9’hù¼q?|Ü8ù~Á‚[ÏÏ•s'Jc›sxX9ëÙ+á²/c�„”ç ˜muÆ�¹ÖŸZlOà1 €€£ÌüÙ =ùsyç½µb|-/áP?Ä5’»„JŸ>¡Ô¬2oZ%í"OŸþϾ"imüŒ\ž#S>‰h ccn�:wŸÄM )Ï…œã†Å}vwÃfºj“råØÞ²`q|¹ 7Oþ1w¼ \È•”mÿ*ßõsfé:¦F'Ê[,êË”5¿‰”9å A޵îUðŒÌcdì¬e•v7TæÆþC&†–vR•_«Ûð.‹22Œ¡ö €X Tí½731FFO/ß{߬)F½¡S%1æ-é`õ�¤òï½ù-ÉLùTžm.·?Ïç?]ð7ÆH’‰qò]¦‘(µŠ¡àUîTP 'çºÅ1²ãX¦„T&SêWW¬?µXË]@ ˜û³Á÷[Þ–Y Êñ…~Ám>s“,ŸÖÏ­FL>ÐgŒŸŠl8®È?"Ëw÷ø¸½’i$JùèTA÷9—]ï�Ú—Yrñh9þƒv;Æø¤M§7ådA̹r¶׫ËfEËÒäì‚ÔŸ«‡¥>ð)ßï1E ‰—Wz¶‘7?/Œ¾è9U&0âïr")Qåø¹˜ò ±¯zµ”€ `�ª¾÷V°¡ñ³$ø7«Äú�·jï½Ù)«$ ”$iqVöÝ»¸²xÎV ×ö‰ò=ö ”¿_<¡?³$&—�Œ\)Ÿg!€v0ÿgƒŠ�ÄLï/3?O­È%.®oP„Ì3Ö$5nûæ†W=Þ 16ˆæðTF”:µçý¥÷ÿ‹•Ù�Þ—)s Ç„�™)ÓÂå»�+­ž×¡&N—±o÷‘¸É�Œ‡¾2èÛ�ëÿbuÞ˜™ %¼Ý�rãÆIùr�L_PX¶*ã£-G$*(¹¿<3w·HØÉñÉ>)L™UøKLp¸Ì~©¿ø^7~_ñi&á¿,�ê»Èû×¼Ý6oLFI ÇYœgý¹AÕŸq<6oR‘ÏÖïÉÁãææ%Y¾�í .òg}Mþû¯ú;5Ææ½¯ª×çÃe$åÍgýÙÆ²^u?xܼ¼ã%}€1>cÌláSrDÆå%ér.æÅ.œ�7uæÌ¼qÁÖ燎›š7ÓxþÖmjÞÔ©³ó6YÁå®þïÿ㬯/ˆ=xnž%·åUù÷+ÕoÆÅ»g—·½FlÁ3K¶Ë„¿Õ.0}úô¼¹sçV{=TPq>_UÜÌ,W˜õ³Á-_ëïñ–ŸkÔëIK,?ÿ­�Wô=§ ï¯Y'6åã8ËñÞj•ËÈHœWôš‚÷ËysmÞsÕ{fIßñóÿ�%ÎcQféŸÁ2’bófOUïã¶ù�PýžŸÿþ>U�3oSQ³üJùkzËÿ¶äñ�pNȲZëÊâzáÊš¾Í:É[«·ËîÝ%¾ ¾Ù²7U:…5ÓϹ¾à<ãNnª8tÁòcäh)GnaÝú¬Œëz�Ï‚eQ‹\ªÆpX™’£žÒ?âøJHÔ[²ý‡ÝÒ}Jaôño�TczY3cüÆ™ƒ–×Þ¾?Vš4(æùÛO-þèKy?*¨`´CÖË_˜¬¯ó-a®áÙ£ß[Ÿhñèèéäì�óúã aáèZýL¢;›)az¡·\Ix;Âh[ŒÅÕÅÝ�— Ʋû—$Êü¨ü¹öi{qµñ €@ÙEÞ;+ôÞkûÞg]_êŽX¼gßzÍæÝÕú‚r¿÷fKìâ)Ö×NŠ‘:©YÖGÐðÿ’б âPƒó�´„÷¥I÷Wò–ø7qÁ+ÒnAœÄþ¸JÂŒ¡Ù?¥X¿'}“´*kVø$"cQÁFGU½^ž›'Í{ZÌd±ª²àA¢Z®hA²$f½',?ĤÅÉ�&e__P�ü$—�ÎËý)Vz޵±¿}Rü‚YÎù×Í:ÒD2Ö=_ÌÚf™ræXþY6[û�±bqJeûMÍ¢I9d3ÅÇ¢Ü"w�ÙK¯ÿßY7>ÿ3K‘3xpKs~6¸ÝÙ¥~Ò�†Mï±é3Ë9«úþzRf¶ê_æ{ó­¬7W²Í…¨“òßs’ï‹yû*é;¾MËõ0þ½ž2ÅbY÷‹âeÖôÂÆ­çgI“®2ÞzáùÂK¸ç6¬Qj†®¬ßM~?Ó³hqÄÿç¬Å#ë»L{QÆ�/Ï>;Djx7— ‹­ÿëò\h[ë ªùQ·±¿«è÷Éi½Í«¿ôš4ÓXt¹ô#Øæ„àÐ ’¤êJÿÈÌp›“J/R‚Ã'Hñ+—Œ‘±=:H‡>cõëÖrb\7[úµÓY`IßóA‘$餹Ѳ;1éÿ³w?àQUþÿ?l$Ú€@ƒ6hƒ†¶�šqÖµ†v µ •ðX¨]�~emk»×.lÜô·¡4Ö-„¶npkãw%tÛX¿k éB«°~“ÖdÛdj¨&" É.‰M¶ó;w’™¹÷ÎL2É$“Iò¾Ïrÿž?¯æÜ{æœsUì J ¹ÖãwèÀéÀ,uÓ÷²Éa@�¡ ¦î­Þ©/˜zwݺ{´jé$ÍY²ÞkÁ*-è­:œû½Õ­sgœ•}./rãZúbýó¡ ™*¯Þ¦…�ÆÂŽãúB„FÒü¢b™^* «O«µ¬à13àßLø“c^Ìh?nU’�J:¿È ¥+t&N{ý/: ìŒ÷zkÚ�Ç \�œÞ"U:¦F3?ùÁÊRçý†vÉS|À6?ìí¹Óu½•“ö²òr••E¼'ñ·1OžÈFÌ¿mmÓ¶kføï}l;B«í¡Õ°µ8ÊÍúöúãkËÂò¸s**-•ë–EÕßÑ4¯² €8’òÞÀ‘ÂàF{S­Ž×Õéøñ£Ú·ûa}bÙÖà1k%ÕͶgê8ë× ¿Ó1{èž™Q2] Õ~¶QfKhq¾p9íª?“©á\õaÊ<ÝQfÆ»Žà2å’Á>äW¶ .Îez”ŽrÄ}Æì9ŽS§9¶œõÕ{�=>‡ËT�èo@Ò/“3õ ~‹”½r‹™ty‹öÜ#Ïzç¼)ž¢JÜq—2S»Ôtô½ðËfM}ßµºýŽfzÍX§,UÅ‘Í\ªPJ�œÕ¦¼@¯�ý ØÞÇ£ª“µZ�ø/•£ÜÅËõ™O>¨ykzß.hõMÝUý­ì{Yðä=BÞØ… 0<±×½õÚû¸û«µPJÿþsz†ŽÇ¾Ö£YW[¶“õNx(ÙKïÓö¥Îý ûv¸z|xTYÿ3Ý•˜•r‹þòé‡åYc›ã´f£¾W·Vfiƒ©o½ö:Û¼<Ñczµß¹Ò?ÏÙ�×ÏÒÜ¡k_ûíY»”*¾ë;êžÑF[Ö­xkM¼�œœ\-ÿìgôð¢yÚ(Ž]ßÕoJVú“ÐÑð­·]oÉ™Ñ;ƒ£=¤ [¤G>7WöÁ"V�”L¯™›¶L?;õŽ:ߨ5o�&1CïµüÊ4…úæL×GïúLÄy߬8­úßgî}¬žž{VMÓúPPÖáˆK|單̥ôJçÍZ•¶(Xþ¦ä̽ËqsïbZÑ7({éÕ4é¬y‹Ez7bªØ‰L<�ä»7ˆ\5»Öê†Àchð«EÒª ‹ôµÂ…Á½qׯo¸FÒ˜ŽQϽpT·ýyŽ)š£ûvÖ-ù¼žøn¥^Õ2]e›ü3%#O{^i׈õaŠò6<¥ö›¯×´Eögï`Òã^ùhÑ•Íü™ùRõ¼6oµƒå«¸ä&3O©­vÏþ¸>“3,ß|Ç�nYnFÖ7 CߨEÏÕñí½4I˜@’ Ê�¨b] —LªròVšŸáOí’{‹$[CéÆ�Ϫð)kRë úÁWB�¤ò”jm°‘Ô¤£ë„~îxØ2ÉßÚª_ø_'H§©^±ØšGÛ—›Ì‡ð¨OÖ•‰Ê{ •üFY�ÍóoÕ5'«MƒTü7׸xΕXÓšóÒ¡ÚƒÎV¹ÂÊïÛI{Ê]]¢ªÂç´ÆÖø{øåfÓPš!&¯v>º§˜óÁЃ—uòk­ïD¸Æ¾+öë›_þ¹ýBÕ›FЭi5½/�ê;bÞçj$õï«V}K‡yIdºš_t^¯‚Jí°5’úOOÍÒ¦Šczqæ } Š‹t•¿ØÒ•w×Y·"=MO:JïüÒV3 Ï46aq¼8"êõÃWnö¿@OÉÎÞFR¼éºÒñ­ökzËÌ01 ²QsÅ@`" ç½A쎦‘Ô[¦æmP–­ÚŠ·~Mÿàõþј¡;ŒjmÌ7?Á„y”_´Z·oÒß. 1³uZ¿õ¡ë%ŠÁ`‡a%=+O¶økwͮݥµ�Lä¯ÒÖ-÷õûÜ> ÑD’ ÐPš¤ãNÖÅw� ÚÝ'ض‹+�èÞ…—©Ût�x»í5½ôìwÍ[îÿãÍwH;òµ;ßôŽŒ0§™-˜á[5 q¦Þ¼ÜµßÐóµéIû=1îƒ)Y·¨Òôæ¿{o_P{Kõ³oÜ¥åíÕŽ^'Å¥ ô%�©zX½+Ôƒ&â9ÖNó°fåÝV/¹NM\Þ]³‰ àˆ¹îõëHÙ½25¯©àÞ6ói½¤ª�›šù¦Fk¾P¡³‡7ô_—¸âßLQÇó�ãXs+—¦ù+ÌðøêÐd\ÙÙ—;BëÝHÑ5¹Ú¬Úâ²Íáê¼`š.³Uj)s>,k�\ Zužik¨×{LÈj툡êm¿¹19ÿæÈkš±XO··èdó9¥]9ßÌ©î\Üsؽ럜݆à<}¶F¢ÜÌp³/³¥-]¹7›’Û*¹ÈSØ.a˜€Éwo­¼ÊÏ?§êj[]nNõx¯u4’†_=„ú5Õ£‡J½ªKp‡Zož•­«#’WU�æËã¤ë™Ùië;j’iÞÕb¾/ìç¹Ý�G¶Ç“À`î®ÇS¾ÇV^zô­�¡†N+ñ×eN�š‡¬Ü?UNðƒ'WyKWêÏg:‡˜?ü· k(mú᷂üz}µÞgën)#ûoMŒtÉ÷¥êöË̓Áú¾ëëUùÌaýáô¿ØÂ+Öºå®Ç$“>Gã¯5ô°  lþ¯` —\"kú“ –8ü2qy¦Ž@·À`êÞiYº>7'x3�»0O+oó¨~öŠPScÍaý¶Ã4”Ú»ô¹ãŒaÛÝãbÿs¿2==crѩƃ¡FR+ºÔ(C÷Ý�7úû‚Ö™l«�g‰~½ók×zcëUaÁ]ŒÝ%¦îÕ¬•ï™á?Ãy½Ùµñ× µOÏTN®«î�ÏÈï¡r �&ù, 0’ôÞ "mþ½zzÿ}zé‘UŽ÷jÔo]¦Ý·�7÷½u£u­³~|ýjjMåm:¬“7îÓ#ÿXªÇ]�³Îô™/�اöÃë¢?»æLÔwî{,Ëœ%7‘¶(û$(íÉî§û Á=mÚ÷·®ž^Ýþ±ì`Êî ­¸£p½k.tbŠëcÈ|H¹ö„Îõ¯E8jÛÕV·Ow® õN°.ñ”Ü¡àTž}¡¹Óg;oß)1ýJs4uò-²&Ôô…w¨ÔÌkº¹ï˶½ë—9¼ «î7³ª¹–´é²úÚ„¯¾µû)å…ê›Ð!³ÖvªN ­Òõya!É•d 5ïŽÙ@èW ¬îTÝ;YS\ žaßï¥\ªYý¦Àv0æº× ÿ.pö­Ùú=ï Zž~KwáÔQ=õÄ^½|.[›¾¶I¹3ÒtÅ3?™ífã3åÌkÊÛÒÓ¤ïº&μnn(7ÎzË@Øê}¹óbwí‹b¨×OŸåªyKwhϦŶ„ÛV»ÚT÷rƒô�ë q__½q� ÷(Ò¨ù¶¦£zæÀKšúçŸÑ}KC÷\¶l«nû.�n:¡sÝÓäÉÍ Î¡j» oÕõwõžkxÊm ²é·\ÂÏ@`Ü ŒÍ{ƒ¾bp׿¦¤Õ#2oS™Š7›¶ÒÚ¸èëºÍ·]�ÚÍ]?zY¿ªç´vq£öŸ�–íUç¿^©–æ7ÔÚÚ¢ßüßëû›wÙgW7óÑÔo:Öi±í^ÊñÝ]µ™'Û¤7pøåƒß·¥Þ Ó�ò%oà¤ÉS­.J¶Å~ŸbÛ=Ъû²®¶Ó:ñú9M»Ú£¬îº Ð8>–xëýh—–¹‘ñÀ~G*Ú›ÔÐP§O>¢¥“gënÓMݱiI`xÏý¬j§ãðéÿ<¡Ó§N©©©IuÇŸ×o‘j*ÝþàbÒÐpü¸y+^ƒê~ºßÑH¨×NëEó¶¼:s¼®á´íͱ½Q¶5ýLû�]ÛUoLêŽÐ#ë–jö¢»C½iü—x´íÞƒé½pÚ¤±á¸ü‹½1Õ„ñ¢‰Óÿ–>+]MºyÔœ §C§êÌ9þô5è§Ukƒa[+Mµ/ª!NƒÚ/�wœ•¡‚ÒbÇžÐF¡\¨BB{•’¥O™‡ÍàR£%PÏ›ÖÐ@R{º.¨áè>­3o@ž=o‘–-Y¤{ö˜‡¶¾%þ¼Bâ7 €À â¬{/œú™JÕÖY�0õî)Sï6™úûù§wkÕÇ—8 Ìíþ%ö;î!Ö½ÙŸþ’h{(¿5Z1÷=yôToÝÓ¥VÓÈ·ûÁ¥š9o‰6îxܼhj³1V�Ï’ÛB—Zk�ß­[Þ§Ó½µWGëqm»e¾y_¼}ñÈ{ÝÿŽŽÖU9¾mÑË/6ôÖÓ¦Þ«û‘ó>⵺Õd«|ã¹>ë&¯cäFÍæ´nÏójíK»™=TLúö=²N“ÒfkÑ’eZ4÷5ôÕýîëMæå¹õa=u¡7³;ëþeþ­ß¼Yk—=¤ºˆ÷!Ÿ�_Þ¥ã§[Õj¾=°g›–NJÓÜù-òÌÕ÷� �hÖ:ÚNùïYŽ7_ Ö½àü; ÞsYo)>®†Sm}ׯ_nêéPÃ�¾ç¸Ç³Ê¦¡µ7ïN×™é"ìÔõ¦\­yÕY@� "0†ï ¬Ïø¦°çø&ýÊ_¿e©¸¾ÜUˆ;ôж§U×Ôû|ï®[¿ªóœ›—ÖÔTks¾G»_lW¶yÁbÞÒåZ·i§w×»î]œß±Ê¼2)Ëú"7¸ìÒO7˜:¨K ¶…µe4ÕþJmÁºß\¸§²êNsVµÖ>zÆÝ¶Ðw¿Œ+´âh¬­Y¯¯?}\­¦qÔjÛØvÏR¥Íž+Ï¢Eš;ó‹j <ô‡.gm< øÌò�ï|Ç÷ÐCY«, h÷Uxå3Oƒø)ôÕwÙé«Ì̵¡s«NéôU†ö”–ª“�È}íõåƒHwoõÁë}ç�øÌÇaLaxËjC×ÙÖêËócº>˜¯Â*_ ç¶`|¾î“¾¢iq¤×q�Ù8Ì—áÓgÖçõx"¦+¿¼/Ã�wwrØFÀ-Àg»[$y¶_xáßš5k’'A*%ñÕ½��?߃õLÄzÁÔu¦þé:½îµ‚h®.tBõ÷y_ù ï=¼eÇzSÞYëóFÉ_~Å1ß‘Ro”tå÷Þ»Ä{½Iű²Èõ¾Çã�rO‘ï«mïM¾õo´ë£—_¡¯1Tpþ€ó7à-í³³®ì¬�rßý^¨2x¿G¹™¨ëË¢•M�ïXãÁèåZn»oóçž%°uëV_YYY¢¢#žAp5¬1sêØ¾7èï™8P�*‰\î¢Õ�1Õ¯¦~/pÝxò‹|åUÕ¾C‡ª}eE®ºÛ[æ;ïúÛ8YYå"Jé-÷õVï¦M¤ Ê9®4êú‚ÊFWìÖæ`ÂñúŽÙî-"Æ®1(`ÿl§G©ùß2š‹ã[‹R #-ß¶ ëTG쓆C/ªj´½å´S­¦‹|¬Ë‰ß¾:µ{�©/3o²¿/7x}×™S®Þ¦ÁC1¯ 2 Ò±VÇ{郥dë/ËÍÇ»c)ЃŸ ¥×qÈÚ0/{xª±ÊÌ�æ^êUcæ, _ T|Gï7eÑ÷ððÙƒ ‹À k/GÝÛ}q¯ŠÕX¶Ú6;Žº×d0kåvÕWÇ’ÕÞs Êõ•àèˆZWݨ’ðÊ+bxÞâ*ýpCßðöniZijÌð¸w/èTCM”£íòÏ¿ïõ&ôÅ*TUžøúúšˆ÷åÅZ»×ÏõQ®’ƒ›”ã]—šs›Ê“!¯øÌ‚Ðþîh³©†Nq¯½a½zÞ¿ÄQnæúî©ÑJîÓ ÷´«÷s_”æWû;ƒOsèjÖ@�±#0–ï Lõu Ô#K‹“™¼'l <ßÇ[¿º®¯Þ¥õkòµlY¾6Ú^,m�Wú!÷ŒuÙ+ "3f¦ýn}†®¿×ôƒŒa1ß© ¨T‡ÏjçêÛ3t˱>l™þ•¡þ´+® ëBo Øt¬4CõòMã`Y¥j›ÛõÔç›ìSçyUjºdƲ,ÿPhn4ûùW-^á†g?i½hó-aÊ�órÿ×&GåQP±Éñp8Ïþ;=gµw¶¨º¬Ÿrð䫤â Z:ŸÒâŒÞò޼ÛÓÁ: €@¬ñÕ½éW/–c敨ÑöÖ�¥•‡t¶{»r“€½î D—»z»ÚOR±âm1½9Tu䤺ŸZ'ÇíCz޶îTmU™¢VÃ^sí±fÞ¾:Tošù¹oŠ_î‚ùò®�ü€á)¼W×Xñ^ïÏè ­Þ~X-µÕ*Š’ë´ü¬oÑSëúyý×ZÿÄr½G…%ªméÔ–å¦ßQ†6ü¨YEQô¬z¿ü šÛ›/¦mORé×hUaL-¬½©õkÅÛ£äPËÍ„6+ë¦Þ0ÝÿæDó¯ÿ„ÌËŠ#,Ýù±k"ìg 0ÞÆö½AÔÏxOQ¨IÉÑ£a�|¼ú|ðù>–ú1zýS[¥¹·¨®mѦ¼À<‚¶¿£yúa}U„û’|•WU„µ;ä{?dì[Ë y?ßϳ¸-ŠÞU“ç¡6 ûጼMj>Ra^ißZ·î-ªk›õÊö•ÁùSCGYO“¬±O<ñ„õè£�ާ¼‘/ÐѪ†æsš|É,ÍËδõþ‰!(37LkËY�kïî}!“y‘Ô¬™3•1Ãö�C0œ‚Àp ðÙ>\’ÃÎO~òýó?ÿ³~ðƒ à„8á:¬— üöwæ­µSLÞ'ë’éÓuÅœ9ÊHw´ÎFq±æõlÑ™s¦§¬y› Õ+eÖ¬9ÊÌuWÇ…Vµœ9çÏ·•Á´i³4sv†Òíß+[¢,‘®¿<3Ãùr«(×úwwu¨í|‡é1käŒß´ô™š“{�Ærll—[,9œèç|å+_1ÿgiÆ �"éòÏýUÒ �HõcôúµÇ¼¼¸Qoš—Î�—¥4ó\|öÌyµw¶Ëª­{“iWÌQVL÷æ…ˆ§šÍ(ÐÉšœ’¦9Y™±×ÉÃèÐq¡ÍŒÞ½è¿/š|É4Íœ1C©1Þ[ c2*�öÏvŠ:�ðD5Ò3•››9´„¦¤+3Ëü íj®B@`HéYZh~†¶¤hFf–ùÚÕ£}UºIxN‰�÷z¥¦+#s4•Çv¹�öß ñ#€ô/0¸ú1EÙ¹f¼Eß×sqª²²í#`�&öwú ó¥«mPGbc'¶Ñ`èýh—ñ#€ € € € €À¨ ÐP:êE@@@@@@`´h(í ~@@@@uJG½H € € € €Œ¶ ¥£]Ä� € € € €£.@Cé¨ @@@@@�ÑHíŒÅø7lØ �ÇÓoÒ¯¼òJ-_¾¼ßs8ˆ € € € €É!@CéÊá›ßü¦n¸á†~¯\¼x1 ¥ý q@@@@�ä ¡teáóù†p— € € € € €@² 0Gi²– éB@@@@�„ ÐPš0j"B@@@@�d ¡4YK†t!€ € € € €@Âh(M5!€ € € € €@² ÐPš¬%Cº@@@@@ a4”&Œšˆ@@@@@ Yh(MÖ’!] € € € € �0JFMD € € € € �¬4”&kÉ�.@@@@H˜ ¥ £&"@@@@HVJ“µdH € € € €$L€†Ò„Q € € € €$« ¥ÉZ2¤ @@@@&@Ci¨‰@@@@’U€†Òd-Ò… € € € €  ¡4aÔD„ € € € €É*�b%ì’K.Ñ?þã?&kI €ÀΞ=«Ë/¿|WrÉH L�:UUUUúò—¿<ÒQ> €Àصk—ÊËËÇ`ÊÇ’yvÿeL@`â ØŸ�'ùÌb|ï{ßÓÅ‹'ž9FƱ@AA�¬F9–äxöÙgeUÈ, €¸&Ož¬{ï½×½›í$àÙ9I ‚d €Ã(xv6”cØ… € € € €Œ)æ(SÅEb@@@@@`$h( UÂD@@@@�1%@Cé˜*.‹ € € € €#!@CéH¨& € € € €Œ)JÇTq‘X@@@@ JGB•0@@@@@`L ÐP:¦Š‹Ä"€ € € € €ÀH$uCé}÷ݧÎÎΑÈ÷˜ ³¾¾^Û·o3é åïj,”iD�XöîÝ«gŸ}6ÖÓ“ê¼o|ãú÷ÿ÷¤JÓp&æ'?ù‰¾ó�ï g�„… €@Džq"²D܉UD–ˆ;±ŠÈÂÎq.�Ô ¥‡VOOÏ8/‚þ³÷Ö[o©¶¶¶ÿ“8:(þ®ÅÅÉ �䯾úªš››“<•‘“÷«_ýJgΜ‰|pì}ýõ×ÕØØ8rB@’]€gœØK+¬bà̉(�Ô ¥±@È3 € € € €$^€†ÒÄ›# € € € €$™ ¥IV $@@@@/@Ciâ͉@@@@’L€†Ò$+’ƒ € € € €‰ ¡4ñæÄˆ € € € €I&@Ci’ÉA@@@@�Ä ÐPšxsbD@@@@�$ ¡4É „ä € € € € €@âh(M¼91"€ € € € €@’ ÐPšdBr@@@@@ ñ4”&Þœ@@@@@ Éh(M²!9 € € € € �xJoNŒ € € € € �d4”&Y��@@@@H¼ ¥‰7'F@@@@H2J“¬@H € € € €$^€†ÒÄ›# € € € €$™ ¥IV $@@@@/@Ciâ͉@@@@’L€†Ò$+’ƒ € € € €‰ ¡4ñæÄˆ € € € €I&@Ci’ÉA@@@@�Ä ÐPšxsbD@@@@�$ ¡4É „ä € € € € €@âh(M¼91"€ € € € €@’ ÐPšdBr@@@@@ ñ4”&Þœ@@@@@ Éh(M²!9 € € € € �xJoNŒ € € € € �d4”&Y��@@@@H¼ ¥‰7'F@@@@H2J“¬@H € € € €$^€†ÒÄ›# € € € €$™ ¥IV $@@@@/@Ciâ͉@@@@’L€†Ò$+’ƒ € € € €‰ ¡4ñæÄ˜`�GyDiiiš6mšÿç�7ÞPff¦ý½ï}¯n¿ýö§ˆè@Æ£À¹sçõÍ¿øE}ó›ß Ö?“&MÒþçŽÇ¬“'@<;�ƒB$ q ¤Ä �äéééþvttSú_ÿõ_Áõ÷½ï}ÁuV@ªÀ¬Y³4eʵ··;‚èîîöo_zé¥ ÔIŽØ@@’@ pŸÂ³sI5z”Ž='J //ÏßÃ'R|V/Ó+VD:Ä>@-`Õ9Ñ–ŒŒ ÿˆ†hÇÙ� €Œ¦ÏΣ©OÜÉ"@Ci²”é1�k¯½¶ß°o¾ùæ~�s@�Xn»í6¥¦¦F<}éÒ¥÷³@Hž�“¡HÃh ÐP:Ú%@ü ¸ñÆ#Æ3sæLz÷D”a' €ÀP¢õİF0|êSŸJ�\ƒ €$L€gç„QQ’ ÐPš¤C²†WàÓŸþtÄ>ôî^gBC&º@=1Á0Ñÿ:È? €É/À³sò—)YJG֗ГD Rz÷$Iá� @`œ ÜtÓMa9bC ;@@ xvNÂB!I  ¡4¡ÜD6ZÑzøÐ»g´J„x@�ñ+ižRF0Œßò&g €Œ'ž�ÇSi’—¡ÐP:5®“î¹VèÝ3&‹‘D#€I/àî‰Á†¤/2ˆ €6ž�m¬N8J'\‘OÜ »çZ¡wÏÄý[ ç €ÀH Dê‰Á†‘'l@Nž�‡S“°Æš ¥c­ÄHï�ì=|èÝ3dF.DˆAÀÞƒ 1€q  €$�ÏÎIS$dh(t¢{ŸÏ'z÷ŒN9+ 0¬yJ'OžìÏ*#&B‰“G@Æ�ÏÎã§,ÉÉàh(¼WŒa�@z÷ŒáB$é €À°zbL�:Õÿó©O}j ¤˜$"€ €!ž�C¬M,J'VyOøÜZ=|&Mš¤eË–Mx @FNÀê‰ñ'ò'þ:‡ #çLÈ € 02<;�Œ+¡&¿ ¥É_F¤p¬>Öƒ+½{†• @¬/å®»î:�ÒÌḬ̀ãì@@’Y€gçd.Ò6’)#8a#�l¦�ÿ@IDAT¹¹¹zï{ß«%K–$[ÒH €À8X½zµ²²²ÆY®È €Lž�'B)“ÇH4”FRa߸xûí·ÇuþÈ €@rlذ!9B*@@�!ðì<4.ó ½óEH@@@@@ ^Jãäz@@@@ó4”Žù"$ € € € € ¯ ¥ñ r= € € € €ŒyJÇ|’@@@@ˆW€†Òx¹@@@@Ƽ ¥c¾É € € € €Ä+@Ci¼‚\� € € € €c^€†Ò1_„d@@@@âH‰7®Ÿ˜ÿþïÿ®ï}ï{zÏ{Þ31È5c@à�ü£þîïþN³gÏ©%‰Œ¼@{{»~øa¥¦¦Ž|dÄ€Ä!ÐÓÓ£¯}ík|^ÅaÈ¥$‹ÏÎÉR¤�èöggJ£;q¤�¿ù›¿ÑêÕ«•žžÞÏYB�Ñøýï¯mÛ¶é›ßüæh&ƒ¸H�G}Ô_oÍ›7/iÒDB@�H_ýêWuÍ5×hÆ ‘³Æ�ÏÎc¨°Hê„°?;ÓP:aÿ âËøÔ©SµdÉ-\¸0¾€¸FLà‰'žÐÛo¿=bá0cM`Ò¤Izÿû߯û↓%�ô"€ÀøÝï~7ÁrLv¿<;�ß²%gãGÀþìÌ¥ã§\É  € € € € Q€†Ò!Âq € € € €ŒJÇOY’@@@@¢ ¥C„ã2@@@@?4”ŽŸ²$' € € € € 0DJ‡Çe € € € € 0~h(?eIN@@@@@`ˆ4”ŽË@@@@@`üÐP:~Ê’œ € € € € €Àh("—!€ € € € €Àø ¡tü”%9A@@@@�! ÐP:D8.C@@@@�ñ#@Céø)Kr‚ € € € €C ¡tˆp\† € € € €ãG€†ÒñS–ä@@@@†(@CéḠ@@@@Æ� ¥ã§,É  € € € € Q€†Ò!Âq € € € €ŒJÇOY’@@@@¢ ¥C„ã2@@@@?4”ŽŸ²$' € € € € 0DJ‡Çe € € € € 0~h(?eIN@@@@@`ˆ4”ŽË@@@@@`üÐP:~Ê’œ € € € € €Àh("—!€ € € € €ÀøH?Y!' 0:.´©Gæ£'m†f¤Ž…“F@ˆY §CmVMŸ¢3Òc¾Œ@@�d ¡4J�4 0AºšžÔ´ùkûr[¨úÎ=Ê¥±t‚”>ÙDÿ]Ú·všîÞÛ›Ó‚ŠF=u_ÎøÏ69D@`ô\hUãkoJ“'sÓÝÝ­éW-PvÆÄyp§¡4Xü¬ «@—.´u¨Óœž–’ª´ôt¥šÿI=tÖô ˜9;ÿ-´ž.sÞùNÿgOw÷äÏ�ÎXÜâßÙ’}F»ÍæÄù¼µå�U@`äºL½Ôaê%MNQjzšÒS­ÜS‡�UOÊLe Э´ë++ýç;¬ú2Í–~«¾mÓÙ®efÌyĉCÏ�:yFÝÆ{nvÖЪç®ßè`_#©E×Ñ~q" ’W@�0ž�ÃH’vG«vÌœ£­Òç)=¦W6-Žp$|WGë)µ´w+mÖ\e�ÑÆUJÃË•=I'Ц§Ù®êSuI¤´]47á—\¥�Üxƒ¼Þ<åf�ЃSW«<þumÙ¸KõŽtx”Ÿ/UW÷îÍ/¯×þu¹Ž3¬�ŽÓGõOÛ¿¢Í�ׄ+,­ÔÃu—²#ÔÚt`÷NUýú\”|K ï~Pë–ç„…çßÑqJOîxD‡Îž°3.ѬY3uEÖUúЂEZ|c®f$àÓ [Ž”„¾§rìf“muOkûÎj]¼$üS×Ê�U]]õ¡�è†�{•7‚Ÿ»­uôõ’-ÚÕW/0=^SYÕT÷Õaùªíܯ…¾¬l}u¡éy}}çÿ‘©n",&Ó³nÖƒÅë”ã¨ã"œÚ·+ZúåÉW¡ç5=¾··¾-=vV›gDˆ#ƒèГ«gjmuï%Þ²ZÞ°p×÷�j¾uÖôƒ‚+@âàÙ9â]˜¹é÷ÙYôüòeóì1€Þû¸÷™û8ïÇo‘7/G1ÞÖÄS˜‰½¶ãuÕF‰ñêÔØžÜ�#Hͽf»¹×ƒP h‰"ÍnbèhxFk6ïøìÇ{Oñ–陲 ÊŽðð7p ‘Ïèi=¬Õs–©ïùÁuR½i$ íª®ûOu)×Ñ£aßÃòܽ#t’kíñÍwëñÍßQUýµ:·¯¡·ç¢^yb‡úž]WômÖDŸ5 ¥}W8Îé8ñœÖîèCq‰´áUÙ¡Ö†¥Ù‘Û¾é³.·…Õ.«C)  0>:ôÌ—×hWøwaQ²çQÙÁg´aùp~îöèð#«µl³­R²Å^oICKµšZº´ÐUY¥¾zí…G´#—€¡¸ö*;ÿ³ÊY©¶ �e5±=¿í­ØjO§íx}µ·}Sùüñ×i(µñÄ»ú®-€šÃ/«Ã4”úÙ&mºœ5½-PV@F\€gç~ˆûyvVÇ«zdãÅr×Û2‘¯ƒ'ÿUË]÷QýÄžü‡Ò¨ È£ê]¶›­A¦º»Û~7Q­ŸŸèÐÂ1ØRÊ[ïYðœžx�É“§*ÒúÇ7jÞžÆ ¦ úŠH�¤y"¥ìÄ9ÿ°üÀ¡¦}ëúm$ œgºùh�g¦ö5uõîêi׫CÿŒ ÓZ�6.›§mÏŸŽé졞”½úÛjn¬W}}½Nž­ÖâA?� 5f®CF^`ê´ÁÄQ¯�+æéɆáë×zxGÄFR�7bm¥·Þ±&‘ -C®¯BAı֥§¼9z#i„�Åázvõ#ÐnMÒ0„%%[ß>ßì¯çëëOêGCé•:„h¹@ W€gçDý%Tkż¯«5QÑ%$žt­ÞùŠº»}ê>LfÒ0,Cº›†xã ‚¥ñùquRs>§Úêv•äo õè4ÃïJX¡éᆱӿ>lz²¸zŸì]«}›>£u¹ö–¸.�:þ‚ž{á˜^3s„*-MïϺVŸX~»>8¹Y¿:õv07—eæ(7»w8_GóÚêh°ô¨üÈ3º?/ۼϵG§�>¡¹KÖ¯u¬\8ªîv÷êô¨´²TËž¡×ÿí»¦·¬óøÝwîÖ'_Ù¤ŒÔ¹z°ºB×7·ëÍÃOh‡me~q©–^1]òÞ±7©•†tÏ_èPe—vß½9äfšvK*¶(ûÝßê�™ýŽ|I[WlÔÇÏïWž­ÓOkS�Nµý·-[—*çú…&}æ!ªí”~ôÜs:öÊk:gƔκòF­^ÿ9-tÍE cЦL™ìŸŸõ­¦ß(%u‘™n òÇPGk“)“6[¼½«9ªœŒtu™ã/‡¿TÙêQ¦;L3ïZÃKGUóÒ+zóíÞ²O›:]óÿüf-[²0ê´¡t’1ø¼®ä7Œw�t}î±Zµ_]¢�»Bu’õy½"kºÞ}ç´WîûÜ]»å‡úÌþû\=÷†R_uèÙ¯:g•òVè™G ”m>{:Në‰/¯Ôz{—L{‘ÄQ_-Xý¨*ôsµw½©'6ïMOcÕÕ÷/Õô÷]«Û¯³U,öxûÖÛŽîÖwo‘>Z¤ÅWOÓù׎뉒¦.Œp±c—©—^RMÍKzõÍwÍ3ÓõÎÙw4ûªùº>o™éA!]mjx¥Ioÿ!Ð¥ºöF�:�èÙƒ¿PÓïÏû\ýÑ;tÏê¼°z·íTƒšZC÷—f^+ÏœNyæYýô?šÔiµGÏÌÑw}Vy‘âDkýb}¢íÔqýä¹Ó¼ö{ó¥mšf¾ÿ eç\«�æý™ÎzJOýä׺ú¶µaeNà’¾ßir|-=mª¹z‹™ž¨îåS²î¦L™bêy3D¯û-½Ò�¢E¹Yæ~ià¥çÂi½t´F/{Uï^–¥é:+Sr¦®¾>r]g¹ œ"Î@ÆžÏÎC{vVúuf¤O¥¾[^j›ºÈzvÞ¬ùï�¢?œû­šçgçhÏ­z¡©H÷Eš[(Žú¼£µA5/ÔøŸ±­º¢AưtéR_mmí ¯Šçôn_E¾|æ?YïO~…¯Ó\góAŸùÆ#tܬ—ÕžžÑÝrÄgz‘;ŽÃr]×»ßë;Ö÷§×r°Äy�·Ìçþ«¬¯(�cKÛ‘oh¿?¯¯ê¤=å>ßÉjWøæ¼Ò#-Á´[+�öðÍñòzgŽ“.7øê»'túj+‹]é“ÏÌK8Á×Ý\vÜò)¯?ëk¬ ¿¶×®Ð׌Ãg¨Š†uné±P#õ¯´øJ£–W©ïlw³¯Ø\ߟëwñ!GP�Ë}Þhçú÷{}å‡N:®±6†#ïa�&xÇw¾óßC=”àX‰.Ñ[¶lñíÞ½;ÑÑK|÷Üs�ïÀ�ÃV,�lݺÕWVVË©C>§»±ÂñÙäü¼îö*Íw—·Ügÿ$z}Õì+qnV8ë_g½¯ÀöyXѪ͆¥¾êv†/[}Ø?èÙðÏü‚rßY÷E®ôçÛê+ëÔö“‡|E^W�`˯Ug˜éy|�vpsݱR�³L\×8êO‰ÏQ�Ÿ?â3ýuc¾¾¸:¼¾ ds¨õ•ÿúóõ¾Ò‚Xóaêé¾ÛˆöÆC¾Òâb_II‘+^_qI‰ÙßûSl�S~Ðñ·H·©1}Õ…Q ¡Uþ*EHgÛaÝbæ­‰p(ú®Ð€¾ÎÿêíI<·f£ò×Iÿð¥|]?ß¼Öü/ʽï1|÷C:ÒÔ©þ2¿o~Ò6ý²Æk~Ù£ZíšÇ${e‘Êó·j½­—Ìó¿|S›òBß9¦ú0 y·Ûòä>˜²+.73!�ÿRGÛT-¼k»Ž¼qLK6‡ÒYóÄsj5C嬨;Ï5GSZï™qïÎÇõBý×”³°·×Nç¹è¢Ï =Y³—šæÍúPºBžÒ›gÏéuk‡Ç<žšaüŽå7¿óO»�nzû5sõ-‰2W_èš­7ÓÔUÖkÏ]¹ÁÝÑ÷``¬ €À„èt}`;?¯S´då Éþ¹dª›àÍX<õUO�λ>µö=òÞ‡tç²ë•e½á>5W�5Ô‡þåˆ:¯¸AùÁÃT_õ¸fž6uµµg ÚªëÔO´Ù‘v3?ÖWïWX?“þ/•zµ7PgM ½XÀê‘:{ÉÆÿάéyæ?~X‡ZžÖÒLK¾C§‘÷FýV=ô¿W_ÚØuæT¨­u¥©–œ;œÁíÈÿµºý)׋ ⫯dþnVÍŽ4E�3îÐÖ½ÓW05;—™—L†Ž„Öj´c«»Þ¡Ù7µ»FëXWtè÷'BW:Ö®žúûvl´j÷ª9Úh» qþ¶¦ª˜¯ý¥‡ô¦¥&ÌøÊÍ6[ €Àxp=òìl x »‘Þ¿çmœyv¶FŽnÔR¦)ÛUÏO›8h]_}~úù­°ß#ö&)â¿ÓÒiº"×(ï¬L§œý÷áa X?‡_mOÏéCZ¶vsÄÃ5�‡Ïûºã7³Õ6š*â壶“9JG�žˆã°?XšW'5øFðM­ÁpýÏk]Ú÷7á�¤æ› •––¨Àú ‹°x –ꊾ^âs>œvF�yÐZâ™kz¤OÒÒ{ÖiÛîg5çö¿5o;Þ®•�—1uüV‡]ÏŸ½eAXXf�¼>QPäØï‰‚cÏÈmä­ýdš$CK}­^ï›2/}Ámfʃ(H�+¬ÆJÇâÑŸ]ÝÛHjíŽ) Çõþ«4s¦)äK~é�ÊÍôhm©éån$5O¨¥ë½þaŽ?ÖHZTV¥cõ�ª?vP¥…Ž\ëñ» tàtßü°&Þ˜Ò=@Þ#$Ÿ] 0Á¦Ún »Úô�¿[ï0/½³7ÅY_¥ÌÖuÖ=²c©Öæ5K4wfš&]·Tëܦg[ç¨hûvmß°24„|”ë«î‹®yZ½÷+/ËþàÊÔâ¿zL¦þ..)×¶ÏÎï=Ðq\_ˆÐHš_T,Ó‹AEaõXµ–<¦ÞÉ]ÒõñµeþöÍP,½í�ÖvQi©\Õ…ª¿ÿ¢ÿ 9ëxjŽy¢=|«Í5P7ä©´Äô=q,{ý/6°ïН¾º =w†7’zLÜeåå*+) Ë›w ‰yJ”7ûÚÓg_·µMÛvÏÐ'ŠJlÛ¶ÕvÛz„Õº=„7’š)LoVSvái¯Ù¼L�·J.¾r‹�v!€ãWÀí@0Ô÷`x \±H`´D•`†ÞÇžˆ¡¬îÏ9y¬ºÊë3mgŽÏ¿Àg¡·äHo†¡¾:{(|*—@<Îßç”#ÃU_¹ëW]­¤Â¦¸ÉwÖ�Ñ® ì¯/wMg �¯²Þ9¾¾>Ât1eö Ѥݴ3ÛÊȪ7•¶¹pÔ)E>w•â®§=EÕÁ)‚š:§ª)ª²¿�¯¾ û{3y(ª¬Ðôþîlö•Ú§/2õ|`z¡öæ#¾23$®4lè}¾BWj.Wâ+«!pOWXš²Îþßógx™YÓ©?é;{¾ÝLrc–ÎßÁò_AA�¯Â5UŸÿp¿ÏÚí¾2û½Œ½.�„㺧 o#±_Ôî;RYæ¿g(.tÞ“YCïKƒCï­!øe¾C'COôöPF{ÝþìúbÁü° 0–j\ÃÚíiÏ/TËÍ�ºŽºW�#à<¥zxµ½‡h†>[´EwïZc¿Üµž©Mµ-ºrëº{€·HÔ?¾^󎽣³Ö˘z.ê�WPQ7ß�zd0.œ>¥3�)š3/Kî÷ &œ°sþò)Ô‘–o+Ï?lÑô¨1“A¯¼ÏîÂÐvd,Ñ&3¹lMàõõæB3avª)Û§dïà_ò¦ÙuB?wØ×kï·¶êþ I1]†_ÙØðÿ®y¹ÉôO^è˜1Zyw¤Œ ³f ÇÇ‘##ÚQ”çßÓñfüõUÆÒ-j9v• nXÛOœVtõþ)GÞ9rÖLób¸'º¾êº SÍg”2k޲ÌËù¦¸q ´Ñ¡ÚƒÎ¡f…•ß×]�Ñ}—ç®.QUásZc{™Õá—›µaahÊ•PŸÓ)´d§mªœt]9ÇžŽ×ô–Õ˜m¿À~ØôùØùðÊ`]2çƒ G_k}'´g}ÕüâÏCaYk•Úa›FÆ05K›*ŽéÅ™7ô Ê[¤«úÒžž•§ [¬¿ÁÍ®Ý�“¿J[·Ü̃?œÿq¼ªŸkºšë]ƒ‹ôý¯¯õt¶®�‘«â®ÔÖyw‡Bªù¹Nt¬ N_`/†øÊ-k €ÀxàÙ9¼D‡úìl j,;tR–f‡�³>O5#%­0_ÙV‡îi¬é‚–˜ŸÀâñhõ�ùÚTú·f„ej`wð·³�ipwpeZä›ÁãC_IWÞ]ä¿›hzÒñ¢í;¿´ÕLÙžÖ¡Ç•˜+i(MŒ3±$LÀ«ÒêGõ7+ûJ\o]Ó ×ø‡eÛ““2çÃþ®è{í;ë]j;+­(þWµé„~lÞ@÷‹Cûµko”GßúÍz¦á¯´nn·Î8©×gz´0ÂpÂó-§gjb {4Ó³¾7œ¢juï\ibá Þ±ÕÝBØ?Їl~ù—‚�¤�kFæwŠ>þ%Óº+ô€´ó_~¦û¶BÏî Uæ‰V÷[ûÑóµ_õ®Ñކö·˜yhÌVå‰Ë{(Y¬!€Àøð–êѯþM°±GÃP_u]0C’¯É×�Ì­æ—~¬æ�íÏ?·K5æ†>Ò²ùŸÓ_åݧtS$®¾êГŸ›l�«jîÔ§?|�3yÁ霻#o¥iþ 3¼½:4Ñfvv¤ág)ºæ#W› lïF¯í®ž}™-ºtåÞl­í Ý)„}‡f;[¦¿ÌV‘ |Ÿa»x�õ•íJÿjþ͹‘ë°‹õt{‹N6ŸSÚ•óýó�;¯í”ã+[×|vÎs‡g«Û9œi�¾Z—Gx2I™“#óèhkTí­«#¥"¾r‹"û@�ñ,À³³¿tûyvöä›È4^ÚîÌ%^]›kk$�ô'2ÈúܺmȽcƒ¼æÅ%QZÌë;öú¶šG~oqµª·¯ kÛˆ””Dîë®þD¦$¾¸"ÜŽÄ W#�O�Ê7¯ð0üá�¦ÌÔüÜë´ ×ô¤´'Àý t¬Ñß(h{~‘ξæúà³ óB [ƒ/;2÷µú¾\ó³A;+:tºþÚS²Bu -æ“î*Ýd¦Á¬~ÒÕ«ê'µ2+Ç�éÅñâÿq6ây—^ï̇ëŠ7_ù½?Ÿ¡™B£_ÑôÃoÙ>¬ó®ÖûLgË~—~.û½nS³o7/»2/�êûr­~G¥çÿ—¾z^UѶ{�}¦Ü3Þ™¯ý<çió'é’KdMÓvcÁò�ݘ÷!pq $™@�™K3ßt=´ê*S[iæóuÝ¢þž”ޤÆ[_]8ª[g.é½¹.¬R÷žÕ¦·¨ùÙ¾Sm§õ‹göhÅzg]£ê—ÔÜuŸrÓG¯¾j=שîÉŽ&:©f¿~Ù¶AKûùþ+dשƃ¡FRkªm^ØÐyf^NWWÇvûA÷º+IîÃÛv®íê8ë«°¯:û©£RÒ3•“›i‹Ü¹êâ‰íËVgƒÛr³ÌÜåÏÖr‹;@�±'À³sÿeÖϳó_{Zë*^ÒÒÀ=–?¤-ûÂ�ß¿.4 "ÎúÜlÆRn?©}ÿô-•nÞÕoEÍŽ|U¬n7#c­Ž|ÚçÉw`c@J$â„䘬)öÏ€«—éþ»îð&>íŠ,ãXð ó¶Ú�O¯ÒöÕ¹½Ùê1o[} ¿Ÿ¡ úÍóÁ–N­yè ó†¶u½�i)éÊZ¸\Û÷ŸÕeKg+ð^+ào]4ÿæhÅ�f¨EoïÝ;õàí{B=ˆÌY {ÍP@ëªÐ²üÏ® m˜5÷ÃÝÔÉá-™i®“zÿsGèóbÛÕV·Ow® ¥ÏŠÔSr‡²ÝŸ )¶‹¬“"¿ÍÁ:ÒïâNc¤|„�®;*5 ¥��ö{µì{š‹ô¥[³œ—¥M7ͽöÅ«oí~JyQZŽÛNÕ©¡Uº>ÏŽÄ0åÝžÖ@`ü Lv}ß¼æ~­Îq¨†ç?Þúªãµ_†z <¾FO¬3o'ï»yNÏÈÒòuÛu~Áeš¹$ðYj¥áŒ.Z�U©ÃS_¹?/ÍèWía"3{ìõ¹Ù“>ÿc²^iš ¥F_-?¬%[¬·›»–ž6Ýÿ=í­~YÙù›´iõ|]±Àc¾• ÖôÚ¸çYî¹ËÙ³²§Iß |ãÖäusm-sî´»ê9g±š ¸2ÖïñþÂŽ³¾š>ËYÛUoÜ£†Â=Š4Ê­­é¨ž9ð’¦þùgtŸ}¸ ‹8°éÊ¢ºLƒû‰×ÏiÚÕeÍ+™¾Ë\÷kÿzOM»âýÎ{´š�:xªPwe;¾ÎÖ©ÿï)׺ B_èögk¢é·\å7 0î\ŸÅ<;‡•°û¹4P«9ë sYw§™&OÕÅš›oû¹z½J,×Ε}Ï�qÖçV[�îVÁ—ökÚ «´÷l»®ì>«7ÞlUËo£W?lDë៟0 ¥ Cys}Y×`†ÅæöÝt]ø•þ%4ªß ~™ê¾• …c­ P¿:Oîo+ 8§K§›Nè\÷4yL'7÷ÑÀY£ý›·Þ�v L§¦»÷ÚN}íU©«Óñã j ½¨ÜvBïjJæÇµÙõŠ·k<ºîž‡µ{÷6­š<'üm«ŽPR4Õ> Þ| >°û¨™ÇÒ¶t�ÓïCm©þ�†ÎÜÏ:ÞN'=®EÓÖéyÓ*×ÕÕ¡¦Ã{t³g­-0³ê)Óú†‘_8ݤº†ã:àjÌlª}Q þü[æM| úé û�ᘭ¶¦Ÿi¿ýQæÍ}/7¨îè=²n©f/ºÛÕHìѶ{o …cæ‘k²âùéAÙùÛ›jMœf¿? ÇÕtúBèÇZ‡NÕ¥±Ê™×P>Ì9uÑË2#ïN; mV®‹Ð°›¥O™¹MCK�–|üA¿{ïÛ¥Íll&o G÷iÝÒIš=o‘–-Y¤{ö4„.‰;ï¡ XC� "ÐÓ¡ÝŸsÇŽ˜Ïëãj8ÕûŽõhq×W®;ûõ‹ÐÑVGm¥óg~ïŒÞ»T껎«¾ò^šºå§ûu…^;­M=Qwܪ«zêL½d¯P¬¥äè/+œ•uÍÖeºåÁ'uêBoº.´êèÓ»µtòl-Y³Q�›að›×<¢†®y–ÜæÌ×ãwëÖ‡÷étGï'~Gëqm»e¾­!Ö:Ý#ïusz¯3åÖð#Óøj åµ:S϶öÖmNשj§ýh½^~ÑšÓºwéhmP•£žn1ÇtÁŠÞØÔýÈéb…ݸyI‰¯¾Ê2CWìµ�uŸá¹õa=ÕW/÷t©Õ4�î¶êüùK´~óf­]ö�ꉷåÙѳf½¾þôqµšÆQëžaÛ=K•6{®<‹iîÌ/ª)P™šë;ÚNùëy«Œê^P©�Êñ7àü�’y�\%§»çݪ}ÇO›±6f1åR÷ô6Í[jB÷'·èùg1гÜüañ 0xv¶WDRè™Óº‰þìÜÑÖ¤ŽúÞºöWþú&^”ß¿¼KÇO·ªÕtL:°g›–NJÓÜù-òÌÕ÷�ŠrUìí7Kõ¢ßF×_ZFëo½÷ùº›«|æ¿JôŸâCý�ûÍéý…eŽ9ßèþö¹Þ´x}Eæm°eæ-±Þ°ð<¾ƒ-¡7¬7,‰žö°kå«lì{Ë®yÓ\xØý8ØÃ2o±ku½õ®_þk *œoÊ=Vê�1íÞàtí…þ&âÒ_X|K°=kÝý†úÞüøê/%v_pþ˜ë Æ�¸=>¯Ç1_ùå¡7Æ›wwrFcÛþæ¾ÑˆŸ8#À[ïcwÙ·Hwûª Ÿ3‘<ª"¦:Žú*ÒÛÏ­ÏIoA‘¯´¬ÔWTþyî)>ØûÕ¾Ä µ¾ª- ;–:Ç:§¬¶ïíôÝ'}æ ±ˆŸÍÑà ¼}þ¼ëM³‡ã-;,‚ú¨é/ðk<µ.Î/7uf?uu~Å1ß‘¨õh~¨þŠ·¾*s¾a6ºWÀ¥Ð×ö§Øé«,è·­Îï¬�R×F£òd¨â>_[6È2Ï÷ëû“‰«Ü‚¥Ÿ¼+#ûy•¼ù&eCàÙ9v»D[%ò­÷<;G¯¢Ö�Öàû©ÏUÐ÷Œõ>­ï~$Îú¼¾¼ÀU'z|E¥å¾êC‡|Õæ­òùgÞ‚÷P�?ýîFŸ™µÝFÿÛeµ½o ïl¬ÔuR¤{ s[4ˆp¼¥¡{±@Fó·ýÙ™¥æ Kr tž3c¢û[Ž�pÎGé>×ÌõñÂÙZ•¸¾rŸmÛÑÃ"xR�vmݬ�[ÍK2‚ûzW +÷jyßÛà­=YË·¨¾ÒT8ÐâQeýyÝeÞèî_L×y{gÖ�®vïq¿$Á}‚k» ìˆ*Ìü«¡Åômpç.tÔ¹9¥ƒL‚t¬Õñ^z{ÙŸ¾ÇÿÒ-û¾üò#/ôŸc^\ñTc•«G¯u¤Þ|S¢ ¯@ÅwúåÄŸ÷P¸¬!€ÀÄèPó‰þsúêëŽÙ“ÃOާ¾r · ^³w—6oÜ6\ËÜàjïÖåŽ!OC®¯C/1òwJ¶¶·×«8ð1ÃååGþ¶oDÁ ­«nT‰ùv1–Å[\¥nX<µ;jú/Ñ…ÖÓaõ|àÂöwÌ4;ýÔÕéï^è§mï�öÀ ,®úJZ¼¡BUÅ1fÞDWrp“ÂgƒHÕ'Í ÆbY<ÅEZÐ×YÝÖTCƒ[ÞxË cì[f,Ü Æê’À濽ªj¬Ðâ¾itâ*·bâ0 0VxvZÉõôSŸ«¾ïÕܧ=Viš"ÖWä¯Úâ¬ÏÂ5Ï­»6¯Wþ²eÊ¿{£}–!ó6§2ýÅB×¼rÖ�ÒØïzãë"Ò}±=<ú~÷œÐ;¡êo¾i,«Tms»žÚ�çx`¶&‘ûèݱ=4)ÿ&]>mª®Z¼Â5$Б‚°�¢Í·„&ÄvM]¨¿wTLÚz—mN÷ùf;=gµw¶¨º¬Ÿ†jO¾J*ª¥ó)-ÎHé %þ¼GH»@`\ ÌÐ-D›$ÄdÜ[¢Û<¶Ïø(C­¯Ò¯^óçmai•š;#Ïc9”újVÖMQr3Ðn¯æN·Ué¹ÚþJ»ŽT÷“�ŠLúOžïÖº<Û‹‰Òs´åp§j«ÊüoH�³·È_OÞ¾ÚQ×DMþG4ÿúOD¹GðèÎ�]cƹYuuäû„Üóå]¹õÞ«k��&±C¯¯¬œÎÐêí‡ÕR[­¢(i±¦(,©PmK§¶,�ü¦ÞŒ¼Mj>R¡hAä–¨º¶Y¯Øß²›~�VÆôDÔ[$Þb­Xàü�³r‹:[jUVý¦§÷oö°™ï7tm\åÖ›þEÆ�Ï΃/RëÙ9­Ÿú¼h³7xß�s×£a_Nz‹~�O}ÞýnKL‰/*«VË é�—‹7ýPÕzˆy‹ËUYZà ?_šÕ{fýÝ8f®s�éÞ´çÙy,C~Ô¬Šhuºõì]~PÍí¦N7/;MÖe’Õµ5Y÷�|@¿þõ¯•žž¼€#mwøða}ûÛßÖøÃ‘ŽjPá/3ßj|ýë_×BûäÁƒ !yNî9õ´&Ï[L�·¬V‡7ØàºÚÔðÊouqòt-ð˜7Ö›yÒZÞå‰'žPcc£}ôÑ$N%I‹WÀ ÏTFF†þú¯ÿ:Þ ~ý½÷Þ«5kÖèöÛoOHÜ_ùÊW4kÖ,mذ!!ñ w$ý×W=j;ըߚ— N¿j�rf›ÏËÓ-:gz=^´*«?˜�½Œ+ôÁyYêÿ£3Iê+ó™}úä ý®­[S¦˜´O¾DÓ¯¸Bs23œ/iŠˆÜcªê�9gzG˜|«ªž5kŽ23ÆÈç}œõU‡uŸræœÉuïë˜Ò¦ÍÒå1¹…0;.´©£ÝÜçX¡\2M3gÌPê ªÜPHƒ[ë鸠––3fFu¯õw{É,ÍÉÊàovpqŒ•³ÇúçÕXqOéäÙ9öÒL´ÏÎôÙy°õy‡iwh~ÓT}s•�™fæ?«óííj÷¿yÓª�c¯­06Ÿë4·A“•6ÓÜÍp¾(1öÿ-qœiÞÉÒv¾£÷>Ô¤cZúLÍH…tĘû³snybL§!0¢]j:ú‚êÎüA3g^®Ù¦Qaú%æ!ò—/è+æ¥öÅ{­ó�óÖÛ€sÛ¾¯ÉÈTŽùÌR·çÓHZí¼¤oø÷®Ífÿfç¡ç.[¬W6…†:�Nì­Ìœ\ N¿Ï+%]™Yægbó‘{Hz�¡ÖW)ÊÈÎ5?¡ ffç ú3/iê+ó™�•³Ðü„òûZŠfdf™ŸØ¯Hª3㬯ÒMÆsâÌ|úŒ ¥‡:o&Œ'ÅDšeë5š°ˆ‰@À&0Ô{ÏÎ!ÇÁÖçé¦Ý!7Ôî�nÚ¬Ÿ¡,©Y¦Íb(Wã5©éÊè·3Ù0Æ5ÌAÑP:Ì —œ ÿ[ó—¬�!qùºåúáþD¹ Ÿo q‡N¹áš÷…6XC˜0ÔW¦¨É( €I)À½HR ‰J  ¥ Ä&ªQˆñ­B%Ë´xØGæ¥ëÏV™y·j¬¥—oÓ½ËoÔå—të�¦ÿ«šƒÏé°y!ÕkçΙ¡�-ÿ|¡¾°ÚÖ%hÙˆ@ ÁÔW ':@pp/âà`câ ÐP:ñÊ|Bæ8ݳZU%¿Ö¶­�fµ9X/8xP_ºÿsÊ͉93R”·a¿:ך·›ùví1ÌÈX©Ü¼•›³åÙYEê«aa$@¢÷"C„ã²q#@Cé¸)J2Ò¯@J¦VoÙc~¾­®ŽNÿË ÔÓ£ž”ÿËÂñ!u¿”¬ß²á  €@H€ú*dÁ €$^€{‘Ä›cR $¢}(©2Lb&º@ЬK{¯Î‰.Bþ@’Q€ú*K…4!€ 0q¸™8eMNíbß`@@@@˜ˆ4”NÄR'Ï € € € € à ¡ÔÁÁ € € € €LDJ'b©“g@@@@pÐPêà`@@@@&¢ ¥±ÔÉ3 € € € €8h(up°� € € € €Q€†Ò‰Xêä@@@@4”:8Ø@@@@@�‰(@CéD,uòŒ € € € €Jl € € € € €ÀD ¡t"–:yF@@@@‡ ¥6@@@@@`" ÐP:K�<#€ € € € €€C€†R € € € € 0h(�ˆ¥Nž@@@@@À!@C©ƒƒ @@@@˜ˆ4”NÄR'Ï € € € € à ¡ÔÁÁ € € € €LDJ'b©“g@@@@p¤8¶Ø@ F�3gΨ¸¸X¹¹¹1^Ái �h�ï}ï{ºë®»-ñ!�´S§NÕÖ­[õ»ßý.iÓHÂ@K`×®]*//Æ�ÏÎã ɸ°?;ÓP:î‹{d2øüóÏëÇ?þñÈN¨ 0,%%%*((–°�ñ °yóf]~ùåã!+äƹÀw¿û]Ý{ï½ã<—d�‰!À³óÄ(gr9¶ìÏÎ4”Ží²µÔ_y啺ÿþûG-~"F@`°ïyÏ{¨»‹Æù € —ÏÎqñq1 `ŽÒ„“! € € € €$› ¥ÉV"¤@@@@.@CiÂɉ@@@@’M€†Òd+Òƒ € € € €  ¡4áäDˆ € € € €É&@Ci²•éA@@@@�„ ÐPšpr"D@@@@�d ¡4ÙJ„ô € € € € €@ÂR#(ð‹_üBµµµþó^}õU�ù¤¬gkk±ž©ÿþïÿ>˜Ào~ó›:qâDp›˜Ø ½OÂò·¾Ñ²>¼­ŸÿùŸÿñ ¶§M›¦n¸! SM’@@@H.�U«VéÒK/ >c[© <_Oš4IŸÿüç“+Á¤FU€†ÒQå�ù§?ýéà0÷3gÎTff¦{7Û € € € àøèG?êouíöo¦§§ëcûX¤CìC� *@Ci|^^žÒÒÒ"¦léÒ¥÷³@@@œÓ§O×>ðçξ-«gé¢E‹"c'LLJ“°Ü¯½öÚˆ©²†ÝêSŸŠxŒ� € € € .`=G[ÃìÝËu×]§É“'»w³�X€†Ò$-üo¼1bʬ=± € € € €@lŸøÄ'dõ,µ/Vém·ÝfßÅ: J“ô� Ò<¥ÌOš¤…E²@@@’V Ò<¥ÌOš´ÅEÂUJG•?z䑿)e~Òè^A@@@ ’@¤yJ™Ÿ4’û@ ‚äpÏSÊü¤ÉYN¤ @`pçÏŸ×ÿøGÿE]]]joo×[o½åß¶^dx饗.@ÎF@b°æ)mll”ÏçóŸÍü¤1 q P€¥I\èîyJ™Ÿ4‰ ‹¤!€ (pìØ1Íš5KÙÙÙþŸýû÷«°°0¸ýÞ÷¾Wÿýßÿ=`8œ€ € VÀ>O)ó“V�ó˜84”&qY[ó”N™2ÅŸBæ'Mâ‚"i €1 X�¤—]v™¿©Õ“´»»[/^ nøÃ¦GiL’œ„ €ƒ°ÏSj}9û±�}l°Ap>LJ“¸�­¤©©©þ2?iICˆIàƒü ¦N�õÜO~ò“Q�q@ˆGÀ>OéÿüÏÿhÑ¢Eñǵ 0Nh(M₵æ)�4i’¿W©5Ÿ  €c]ÀzYa¤ÅêiJCi$ö!€ €Àp ÜrË-þ ˜Ÿt¸D �ñ'@Ci—©ÕHºxñbYßv1?iICˆYàÖ[o�8¼Þªë¬!q, € €ÀH X󔦤¤è¶Ûn©(Ƹ ¥I^€Vïk¢éÌÌÌ$O)ÉC@``ë‹?«^s/V=gÍaÊ‚ €Œ”@`žÒ%K–ŒT„‹c\€†Ò$/À|PmmmIžJ’‡ €@lÑæ) …‹-ÎB@/`MõóöÛoë†nüÅ\�B€†Ò$/æ÷¼ç=²ÞÈÇ‚ €ÀxpÏSj=´XCáX@@�‘°^êdMsÇ‚D ¡4’ û@@`ÄÜó”2?éˆQ0 € € B€†ÒA`q* €Ä/àž§”ùIã7%@@ˆ_€†Òø @!`ÍS:eÊ”àÌO¤`@@FQ€†ÒQÄ'jøÿÙ»ð6ª;_ø_¶vbœ�„¤\‡4¡]'Å¢MJSþ$ „Ҥĥ ´ ö!°U²}i".ÉŠÛ¤wÝ}pE»›(OË:¹¤î–˜ÛbÚE°Ô,»Ž[§€óä:Û(-ò-q 6`änìTÞž÷Œ¤ÑÌI¶õǶ,çyÏHsfÎùŒ¤ß9gfÎP€˜ªÚU¥Ú¤�ÃÍñI§ê§€å¦(@ P€ @~ °£4¿ŽsC P€˜·Ür ŠŠŠ „Àu×]7%ÊÌBR€ (@ P€ù-ÀŽÒü>>Ì(@ P  ´+J?ô¡áÒK/Åܹs ²Œ,(@ P€ (0¹ØQ:¹ŽsK P€(��}ìcОvo·Û ¢<,(@ P€ (0ùŠ&X P€ &£À7¾ñ |á _˜ŒYgž)@ P€ (@�`Giµ¯¯þóŸ3HÉ$ @..¹ä’\l†Û 2ÈU|ä‘G"9xï½÷2Ì “Q€^€u†á}ø.ÆZ Wu†±Î'·O�B`LÿȲ£4M³W_}×^{-–,Y’fJ®N äB ££À}÷Ý—‹Íq @šŒƒi‚qu P`ÂXg˜0zî˜ÖøA ÀÄ 0fæÏŽÒ4Ý^{í5<ôÐCøÞ÷¾—fJ®N äB@ë$Õ¾‡œ(@�‰`œwî•H_€u†ô͘‚¹`�!—šÜÒ`LßLKÁ‡9eæÆT (@ P€ (@ P€ @ °£´€&‹B P€ (@ P€ (@ d&ÀŽÒÌܘŠ (@ P€ (@ P€( v”ÐÁdQ(@ P€ (@ P€ (@�ÌØQš™SQ€ (@ P€ (@ P€$ÀŽÒ:˜, (@ P€ (@ P€ (�™;J3sc* P€ (@ P€ (@ P €ØQZ@“E¡(@ P€ (@ P€ 2`GifnLE P€ (@ P€ (@ �;J è`²( (@ P€ (@ P€ @fì(ÍÌ�©(@ P€ (@ P€ (@�`GiL… (@ P€ (@ P€ÈL€¥™¹1(@ P€ (@ P€ (P@ì(- ƒÉ¢P€ (@ P€ (@ P€™ °£437¦¢(@ P€ (@ P€  H€¥t0Y P€ (@ P€ (@ P 3v”fæÆT (@ P€ (@ P€ @ °£´€&‹B P€ (@ P€ (@ d&ÀŽÒÌܘŠ (@ P€ (@ P€( v”ÐÁdQ(@ P€ (@ P€ (@�ÌØQš™SQ€ (@ P€ (@ P€$ÀŽÒ:˜, (@ P€ (@ P€ (�™;J3sc* P€ (@ P€ (@ P €ØðòI@IDATQZ@“E¡(@ P€ (@ P€ 2`GifnLE P€ (@ P€ (@ �;J è`²( (@ P€ (@ P€ @fì(ÍÌ�©(@ P€ (@ P€ (@�(* ²°(3�þ³½‚üº”ÎÆì’1Û 7L P€  �¡~ôök5�"Ìž]f¼Î9 P€ (@�1`G阰r£…$0Øþ#Ì\º)V$ûPÅÎÒB:Ä, (@ P ñÔ¦™¸ç`4kκ ž¼·2óÉ,Q€ ÆF`èl7‚§ÞŠ‹ã;‡Ã˜µp*æ±QGáLNØQšSÎ±ÜØÎöö`¨¨ Eòê‚¡¢9˜7™.mÄÙ³}@1J‹JPZV†’ȧo½Ý=(šSž·Wj¾þ«&Ó�}çÂr‘¿É&ÎR€È�¡Á³èéBYYúåzsæÏ‹Å¡üÏ»–ÃÁþ³èë—Q´¸%e¥(+‰¢¡þ^ô ¡|ÞìÔ™Ä18u¡òû�þî“è …Q:w1eÚ�| �±NR­´ý¡sù]h掠À¸LîvqVñ|\|ói'ݨ™³»’dÉæmÅñí+“¼cyiè,Nv¼‹°¬?-®XÄf¼…‡‹ÉØQšÜ%�^Ä‘gö³qš­¹²»ÑPó06¬,Wßé?‰Õ<†¦3À õ¹4sçÎÁ¥‹âcËV`å5U˜mùœ>ü#<º_vÎHLÙÜ9YQ¿d!–_wÖ}n5ÉFgÊi°Ïíÿ.vnÛƒ€e%‡Ë…Sû÷G_·ùÐs|+æe™wË.r²F¿²ã\–ò2(@ P OÁÞG=ر?!ŠÂåmÀ·¶n@¹åä×É÷á±úcÉ‚¨ �s1ç¿]Š…ýV\½U‹,”C§ñTÍ£h|+iòˆ�FV-ÇMë×auÕ"m`—”S÷±çðÝê�Øã·DQ›.Û)ì?}ÝÛÚƒí+ç©ÛI7«©¹”¡€z'Šm¡g±<“»æå‰Yµ’a†˜Œ @A¤ß.Î*žK³\¶‹Ó�çgñâÞï¢þè™á›åû8ì7Þ ûªJdjòú£Ñÿ&ÚRdðò’Ñ´Êûñ£ s°É݈Ý׆C[—§Ø"_¦€I@äñ´páB …ò*‡O<ñ„x衇Æ'O¡ ¨¶CÈÃ5ì?Gu£0+…Ú|î¯nÏ.|M¦ò„ESµ=�ôž†€)½1êð Çy7òâ­²ÙåÝØw.ç:\&{$Ÿ¹Ü>·•žÀ¸~ÓËצÀ„ìܹSìÝ»wÜö=™¾ƒAµé÷;U,u‡9ІEcqÐîªzqLæÉîóîã› É|8F‘ÿh¹då?žR›É$+àBÆ¡@­rÜ|mIðÈÛw—©e=Æ#o€kL¦ß+- d+PÐmçŒÚÅÙÅs!rÕ.Î0ž‡Z…ÝŒvsêúL£¹B’í*/Ò‡DƒÛ¦ÄTÝÁa©÷$ÏnHÔ:L^ŽZ¥ß$yšÂz•q0³ãɧÞËoZ^NC'ñàÌ¥ØÕ$ ‡Úð#¨`Ú¼J¬¬Œ4(ÛãGÛÍ]ºF{5Ù§ªHëµ*-Î`h�R(yæt™{N…@f¢ŽOª‚¾}`8¾–„[Öm¿0ÝÙ'ïèH¼-_^JÞßnXÔ™/3‡SÂú›¢­Þ“p »ù–®p°Ny¿6 ì]´zÕÛóÍ—¾÷µx•´òc(j[{ô�ÇÿëÌ·´Go½�¾™eÞ;ý û�ä!Ð#‚ ‰åÖÞ\"÷‘¼� I·¡­ëm5”ã…‰Ìt ¯Íti¿r«„Wô„;…GyÍ´®§IÙT°±v„[-ì¢V2!&—ƒ²+ÉÃÞ>�‡…YšPÞzŸÈßê³Þ²n –ÛÑ:’Ü–ï3Å*ktÔâ;èjž„¡q†‰cŽ:5†Ë8¯ÞNçÆÝÙ=‰±ÄY+¢è@@8M1E�ÃÙÇàh1CMÂ�PFSÜ’û¶¹|"h‰²\6Sž¢ñUMc~Íã7ý#÷›mzýÉ[4k]j=ż_mÞf2AOùÛ^gò[ý¬Û‰Ô"U¤>ÑTçžêjá²Ôì.�¨–¯Gÿy„Çã� œyïaáw¥0³ùLõ£ã&“·zG[^™7[µ2Ü„±÷ü›c�!ÿŽ s4vÙvÎA»8»x.Û…·‹³‹çú'%Xç4µKÍmz¹F8¨ Ñ¢Å(_›90Ëu²Š‰¢Ñk­S%�Qvo«žea‚&;ã1¬Oø,qR{?u;¶Ù�¶¤õžøNM3¡`“ðz´Øë6Ùiù¶Gâ´“=Ú:µ�#ÆVÓ¦'Ý,ã`f‡Œ·ÞËoe¾MgOý‡éJP-wì÷ܦ>¡MÞŽõ°¯Nͺ¿¿��ú¯];ažúŽ¿T‚åw?Нl¦™¦æ/Ä/ÕŸ7½c™êÆoNœQ^ Å—ÑtpG|)2ãöã~ë&ä•_¼æhLD§xFcËiæýLg,�úg‹m>–nL¼Š5ºÖ~¼8O0pÆ|†+þrd&õ¸ÑŘ¿Æ\"sº“x§ç ÞÔ^²Éf¤uzí±6 áðc·céú-‰ïRÒ4c‹2aóS'”WrPveƒ\ (0éÎâȳ꥖ß÷°¡B}bSÅmnÈq«”éÙ#‘_éÈk qð¼|²Nl*)_‰GÖ¢Ä0ÈÈýÒQ=vX㘞2ú·û·¯%üÆë[<ùoØ¡\LjƒÿïîGô ÓvJªð€9ŽOׂh.b0 ]3sÉZìi6í/Él`ÿ6,�s;uGo-|÷¤úàÆ$áμ™Çÿ±x½Eæ>ËôÚ¶‡ºáv9tÑ–ýÃg>  ™Pú N¨cÈÂËôslØ¡^¢cζeþ]| ÞÐé&¬Ý´5»v)wüh+7ï¯Á.ùzô_ jjv`ýßøS<¨©o¿nÙ…¾xùôaü•éqÓuò„ò¡Ó÷˜ü¯¼‚ú¡RëÉWä« ²ÈE»8»x$¤7i˜vqvñÜØ‰Ú,—íbóh.E3Qa‰µ3‹�›†³�‰§_¬Æúj�ÊÈ™:7ÓÜHV3]Q�aCïâT’�cN®n9ý¥æÝk±£F‹½Ö»‹š#qZ�É5Ú:[Öãé¦ÊHú»cŠ`GiÔ·ŽUså¼W%^=�’+V@^MbšüøMçè¿ä«6}SmäÚðfŠä�ïü6oÞŒ¯|åv\P¼[, ˆ¯Ú¯ˆå#Œ3ïš²$g}_Z•¼b_¶ÿ»©òLjý߯rµ «nIJ4\ÞË–Ý‚j‡%bXÒ'vVÚðÉË�ÉFµ ë6åÍsæÌLxU{Áá½ Uå6lòÊ#&Ç:U'¼[ì‘[ Îy«-ÁÈík@k ˆ@k#¼.µ#vÿ=NÓ¸zrè‚”]Í—(@ L2�þS8dé#»óæeI Q†›œnåõæC��WÊjÑ…Ù«ðMùÄEóÔüÛw̋Ƽ7¾&cèæÍ_Áík.À‚Õ[Œ÷´9çíX‹óás–@l¿«�s•ý8ê¼ÕðT×âÛw.•oå Ëa ¾¶z›y7‘y‡ÛyÜ ñÕ�µÎÇ¡ :SRi‡Ïü¾îô“ƒ7¼Õ.ËvâׯåÍ6½ìåÄãεêÉf9dACS+‚r¬ñF9ô‚zÄöÀæyÎ4>ìYì»Ë’^+‚Ì»¯¶¾j7’Õ."çy‹§YÊ6òbüü°²êlÜä®V^‰/„âs‰3Y7Y{À�›| eÓËêöza©~ÀÿÓWFÿ]IÌ-_¡(0*�qi§Ïe®GÛ.Î.ž§â !ðÊ;r‡_| �ܾÞrrÕÛzÇA¶1x'ЪdÄQ„¼>"BP¶ãÍ154¨Ÿò•wÉ/ü$äÝê¤Ç°¢%¸Ã§öb¨+f¿4mFzÛˆœkN/ ×.p�ä5ï/ôd+žãú*õjR½%‹q½¼æ é$Ïy哾bŠ¿ec�å­ä•vÙ·ç?¨^%¢¤óÁY¥ÿ aîåÚO¦©•j:«¥$“ kîÅ£k¬¯Žby¸¼—T`ç³Ç±³ÿ¾2s*›³£®õ`dü”ÁÞv¼$Çë”?Ú³ß!Çg5­¨oC¾ÔbfÚ,�ZÓªÆl nÛù,Ä–CX3­!`óáÉíÑB®Ù¾Þ¿æÖîCÏ¡­±+…úñ´ÇÜ8µ¡¡£M^¥M+Qµr¾øÙ±d£~v, Ǭy ·éxÐó�MÙ�qŽ Àä(�…e²rnŒÅíDåâ’¤åXð—W©¯‡Î§5Èÿ¼ùj�©nÍ´ÀAóÀâ¦w´YïÿüR|Ü­þ®õ]9ž–Ô7äRY%îݾÓôrö1øÄS5jG£ì>«üwWéAr'î{æØÌwh4oÃÿ9¶IŽ“¾[eüµïû l[bÑWž´É;KŽìŽÞs×Õs±x½qwÇ©7dy—ëuˆìÒ÷û9¶™ªÚ~Ûä~u¿ÊÊ*¬»ó‹xdÅÔh�¸Ú´ç‡x­ú¶HúO<�-¦ôÚÛîúvß]¥ÍF¦­»ñØ—Ã|NSk•Û娴>üòäx« 5¦±Üå­÷XwY)Œ{ufẻ¿˜¼n'·UqÛNÙÕŽk?öÝ>[Lõ¼H&’ü—Ýq+Cùš­8>p=n/]?þòÈÉzÈ‘èÕØÛ�²Î¶;tŸævôÈ«š¬Ã«'É_¢(�3�±j�>ž�¾]œ]ìP®*uÈ“Ë×ÊqJM¹âF|1ɘ®Yg‚˜ÔzÝqR¢ð3oœ�±–UœØúæ¸-oÊGãÈ£ÑFПÎ�±ìYÖ¤'bJèõu¡¥ëXUýØ—È¥o»·2÷9›·ÛÝ64ëâlÃÏÚ]rPíô{Òè$•{®þÛ/·S¾Ž_+±H6¬¿¿ /GA¡gS?}\ï$�¾Ö|´]�åjƒk¢Ê®g“)@ L @éÜÑîܨ(GRȞΉ¨íXúy|´Ã/;¤Ê0ðǾÑf>ézÙÅà~´5ª½r®úŸš:I£»¬ÚP�× Øhêü=t´Sv”ŠFæìØýˆ1|Ђ+–oɹSÝ(ˉ £Oßyô×Jò€ìÝUÚ}€Tìù<'£“4òš�®~,—�¤ÎWÔôpÖ£ÆÔIY½d¶×µâ•9Ÿ‰u(®ÀÂH?oVݽ«äJCí?R:Jïz`6W%ï¬�e+åŸÑÕórwÜ"E‰åÆV½Û4dE.SÎ œÂ{r„ ù‘åD P`&O»8ÛxžªÖIêkêÀÖ5ñdÙÆDínƒëåUY~£^  ¹³ZþÓ'›Ý‰ w9°Ýû°¼{21Î Ã,>Ô·™‹¿e‹VaëÎHDÆü¶=ؤÁq;ví¼Wm7çb‡ÜFÁ LD{ às] ðyã64mÛþ_0¸ÙÒÙi~*‹½‡Ã ·M¥ =žú|uùÅ�Ið~ï)¼úü•§þjØëèÁö•²3ð]ý2 =ocð1K#ïz.µÄ;Iõׯæon|@^3ºçžøæwÿø—¸÷Ñ›ðün#°È‡!àþU £ÎÅÓh·+ú÷WÝoXædO;n‰¡ÉXoüÊnì“s &D`à=´YN:½õî�|Êyb,êë:­f1$;¹ÔW†]:g‰×2yòÉîA‹ï«�QTÞÿ¾›ëU4ì6?©¶¿V¹Ã »«\‹²ŒÁ¥rŒly{¼¼ŽÏ3EøèÇ/—‹¦xoÃÕXO››‰‹MªhÁ_F† :¨®4ÌR¦émòzH¿t˜MÇÞ �K~ÔS^¹4{%ž u¡£ó J/[ŠrË.¬ãÙ�� oB°¬ŸýâX7àòù›²V†ªë�ò6&ãÈ%œ“5­ÍY P€¹¯vñ¨ã¹,ÔhÛÅ[³¼k%•ŸÍí¼4E`¹ªWV�¤‰i3‹‰Uwl…]ÞÖ T«L4Ë»Nå¿][d<~øå…SùuþlÀtí¨Ì¸¼sHžã¶Ýl*g§°@b«a cäKÑ~òZ™ý´‡œ=ø*:ëîE¥åh �|ÙrU„+MãlŽTžöŸ}ß¼¹úå¸D^i‘lZTõ TÆ/I¯Âª5·áSsÖ`í.ãgóÅ#oÈŽÒe°ž9zö…ßÈ«L´3:¹›ÒÉ{|¯)qñ5r6SRqkä!!úír�šzrüOí ¸¿ýUµq%ÛÏJ¹v»¢Ó)z)¦3  ¿r�sÝÈiËž"·|™ Àø”}×Úe�‡§^îÀm‹*-ûÂ+ÿ¬ö¢Ù×}³-k¥\:�ïo3Åj¹âUå³’¯>s®®ªŒWÌ«dL¼íó×]�͇ðFÿV,S«ôr$›gñ½[±f˜ójæ�fƒl4:Iµí–¤>Çz!HÊNbsæ"óÚ©½l¦ÔéÕÓ¿ik‡Ë¹çRìn†Œ£˜{ ¶èQWÓËDÃÄ΢²rTVY»HSìhÌ_£ãf¹àzÌ‹ÁP€°ŒK»8�x.ó7Úvñ_Û-?¢iÆs E|ñëßy›ë^Åš9«M˜ÍXûµ}è{vs¼£Æ´ôcbd‡óÖàP¨Oýã÷åðq{Œ:K<7ÆL³¼pªnCH¶ûSt•Ê»vÌÓx�l³Ö‹,]*æ,qžq~Nâù33[>ºNë3ÎíǾ§PÆÈÒºÔž~ìK¦—áÒøïR’ŸÓK½ÇžÂ]›L½vrK¶ê; ‡YlmYö¤-ZW™ mòÖ3§z5Jó®oáů¾„uI®æ9{ò0žÔŽêgcbW-6J£†M aÇ£ˆO™¦Ÿ5×E½5Ø·}e,‡–?ƒ½8vôð‘«¡WO¬éýÛöá„k’Ý5ßÛ~?îULÿÔq¯éVGË^b‹Öêö N·¿Ž3á™°U-J<®ñ�X>G²‘i¦Œ¯&G[ËÅq©î0ìq12Ã9 P€9ÈE»8»x.wÕ¿¤e³®¢µ‹³�çúŽ¬Û†v—‚|U�߃ÅÓ _ÿT?·»o‹¶ ­1ÍžfLÔöß}x/œ<‹™Ÿ¹{B¸,܃·ÞéFׯá_ý?Åžƒñ³Ò‘ìúõë²£t¹žuõÔ¯_Žm-ßÑ«GG_O›™žâÄl|¥QÔâë3c�£ƒ½§ñú›g0órͶÆëa6Ä· [@>µ,o§… ŠP(”Wù{â‰'ÄC=4æyjòØ„üä)ÿ\¾FÑ¡ž ¨u%¾ïöwÆóÕlò¢|Sz»¨k ˆ¶¿�ON7½®¯cþÎp4}¸O4V«Û÷4´‰ÎŽ E[k£ðy ÛpÖ¢éBÞœey_Û‡ÐÖˆ®`‹ð¹Õ|8ë‚‘ôYå]ÛÂ@Ÿ¶µ‰ÖF¯’»»N´äëÚ{­­"ØÙÙ_â!ÑÑÖY§-�jYÜuM"ÛFk[@ôD •¸!:…'Á!º-W}´¬jª°ht«îò ¢1Ð%bGFÒõ‰@K½�OŸ�—Í¡»k˺ìjŽòqi¼¾ƒùXvæ‰ÉvîÜ)öîÝ›ì­1ymR|»…ì*�ÿNFã©+ò{:0Á¦Ú$ï{ä¯vlèM^5ÎÙÝõ" cˆ¿Î+ä«–mËe·?þ[Ý×aÙ¿½Z´ÉÚ!chPn£±Á'äÃá-ÛpŠ@,ž꜖÷ ´ÖÑ]a ¯K´Èm¨ùˆ¥Ï2w5z÷í©�¡h$ uµŠjS ŠÚuˆPW@Èg¶›¶aµMѧ%—1ªÍ_mzÂæªAS Í&}¸ËŸp\]µZÝ)EEŸÌ_½×eʃ#îž,½¼—P´tÄê zýE©G9D›¥ Ôš¶/-äñoíì]òóS[­7W}‡þ©‹ü õtDê­­m²®a)�Í#šdý£M¾§Õc=ñ´Ù7ùcð«Ç^;6�®hÙû:ÛDµò™µÉãŒÖëâ¹È¿™Iñ{•lÌÑ$(Ô¶sVíâ,ã¹È²]œU<—ŸC­ÝïU~{!Üu-ј*B¢ÎaŽ·Ú¼CÔ·Èv»¬/$‹iéÄDíkÐæ3Õ…^Ña‰wAK}Åák3}{dÛÖÒ§áiȸ1 ã�ZÐêZ¹zâñ:º™žŽ@´M.ÛÜm�j£mm·w˜êF&B¢ÖbTÝÐ*ºz:#ý"ÕNs„Kõꂱ�I?Ç8˜Ù!”OÕÌß©PìG%Þ×jéè´þZ–í>¡W—*èJƒÅ’.öž³.ÖÉ)¸ê-?&ÖÛTË ¦_ÎNKe;Uó뮆‘]Þ£²­^ó^òòF÷k­Iúᵦ€0 ;¸R6:Üjc)²=£1œðYHyÜmÂn³t¢Æòæ¨5R¶eOÈO¾Àû<<(ÌÒ„ °£49¿R¹Åo¹·%EE]BGàp±D{ÏïlÖ%ùÝ)½|_Æ’xý<Ü‘òD›9nªónÑÛ@¦18*Ù'jÓ,¿Ý×M:Цtšóç¨k-)ãs¬³2Ûô2­æF�é¸Ûlö„NÔhþdG§©.�*½¹,ê|bÃ*�πݳÓe'·z’{äÏM}¼î•Åq“»øRÕ�œ¢Už|W;å�|)'kµ2äÙÄ:CžfgL ¶íœ²}dü)¿Ëñv±ìHL3ž™ã¹üQξ]œM<&&Âkö4¥ø}ŽÖ RÅ´ÑÆÄ@­õÄ­M¸½µÂßÔ$üõ‰'}}mê…Hõæ“)Ž—)VÃ^+»£S:±4züãqä:G±ßH’÷ Œé—v6Î8˜ò_ȧ|� øIg#d…yäÉ^�Ž_l5žž¶Œ‡2œ¾ÔÝ[[ký£h,¾ewCÐôdT9vËm�"Ð ¯§íä¬Å·n—·,f•wmgý8y¢y”{•÷°%™ÒÌÐÚ­<—޼Ɋ/|%òÐ ókŽÚ“ÞÆYG÷'ƒ rT5ë�w‘·‘ï:á¹C^7™²/»±]ÎQ€˜ÜË·þòªÐQ¢Úß�í¦‡ë¥EÑÒõƒøïzø\A}Œ[°‹*ðh(�þó>ŠRÔ¶<>'ãÙÏllö!¯Õd÷4àg[c··Ëñ’GVy«Ýù³ÃÄçÎicd›^nbåÖ:4x34›†42Šæ¬õ(C2¤Jo¤P窷'Œ!_Ry |‰YPF–ìøú—¯‡S�¦j¬b�{K{ô|dÊâ¸Éôáé©ŽÜ œí>m/¶»ØŸÐéçYÝ—(@ Œ �E»8›xÙÂ˺]œM<&&"kÊ1D¯—ÃÞ%LÇ¡…‡T1m´11a³2’îÙ±޵ká¸güææ©Ý‡//WGz¯XïLÒ®MܪñÊùøC5Ó¯O½Žô�ß` >ëòÆ—†›±yÜX¦� 0ÜŠ|ojdÖ¿:>© ö¬X:|�¢Þc=“cœñÈKÔõ³.úfÃ]MIn}7Òȧ© »Ã)<¾zÑÖiM-/±¯Kv¤)}ì¬�v&ÊéöЦ ~Žžão¨£Ixɯ„”ß0as¸Eƒ¼%_¿Š&Û¼k{î´Ür¯í'é?yû€>Ú€‘c!zZ“Ý’™brÛÑ[ *gҜʕ+ÆZ–¹�.á÷ slQ]'o'´Üþ�mÙ-¹ÈËEžËËÃÂLM ¯(¿³µ^8-·­Åc‚CÞÊÜa�ƒaÑâKwåˆÞÂf—ñÏåõ�m 1XÈ+_Ü©ö§Ä£h,öÖ7‰=&%$Zê<)®„Ôâ’veGƒ¼%?ùÒ�ÁêîD›6D€’gS,´ËøÝ¬ šT^9ãMó½-�¢³IG?6W]ô®˜lÓ› Ð%o[w§È‹¶_‡«:2ƒ)‰2;|z›pUËá|¬AؼY«s§¸CE‹árH€Ä*X�¨Snë7y';rX€€õã+¯€Jû¸É|§¬?8|2Ÿò¸&½*KÞ~ßšºh昨yÖ&Jžû��‚o;§Ý.Î2žËƒ˜»vqñ|˜˜è®˜>b!!O*í]»»A©Ÿ ÓRÇĶ”w¨ñÉíó‹®äUÑhHR—pˆÚ†º„> Gu£q§f(0ÊúT4/Ö2›€DgK]’!�¢é´ú€¿ÍRŸ1'žä󌃙À ´d²Â˜—ÓG>òüîw¿CYYþtí8prœN|ï{ßW³¡³ÝžzïË3KÓäž‹g\‚˯¨ÀlåÉ㚥´vÖ¯ ’üÆäÅ"‘ÜcƬY¸tÁÌ+›$H«´‰+w·Ÿ�m(ÆÜÅKP^–Æ ÑCýèîêÁ™PX$.·+$5wÎÌ›�?߉ÄÒŽí+õÛRqëÈ\`×®]˜7o¾ñ�od¾‘4RNÎïàºOñf·¼úM Cò! —,¼åê•i0Œïª2œîxè•QT濸xf]z)”ÏS²”"WÙÅà!yEaÞ=#¯”•�H»ðsîÜ(Ÿ79âP¿¬?u½{Fæ:úø†Ò™s1gþ<Œ6'KÿáQºGÇ`?zûúå³RNúÍ,›ƒÙãR÷™ÜÇ-ÅG9í—'çïUÚÅd D¦JÛyR·‹³ŒçÙ~Ô“Å´acb/Nt¾ƒsË:S)ú{{Ð !¹ D†µs±`Qù(bª|ˆáÉNy�n1Š‹J#i&¢ ÿl¯¼Jø\¤.S¦*š].Ÿ_ž�YUžÊæ-ÂrùoªNå•UÈèè•¡|‘ü7UáXn P€9(By…üÖJŸ“mŽãFd,XT¹\þËlŸÙÅà"Ì._$ÿe¶ï‰NU&3^™Eæ³M�’2Ì+ŸˆNåÉ}Ü&úsÃýS€ù+0©ÛÅYÆól�JÚ1­lªªæÅw[6OvŠÊéO%XT‘a%&ý�¥LQ6[ž(�$çÈS‚oŒ‹Ç(fî„ (@ P€ (@ P€Ègv”æóÑaÞ(@ P€ (@ P€ (@�q`Gé¸0s' (@ P€ (@ P€ @> °£4Ÿ�óF P€ (@ P€ (@ Œ‹;JÇ…™;¡(@ P€ (@ P€ òY€¥ù|t˜7 P€ (@ P€ (@ P`\ØQ:.ÌÜ (@ P€ (@ P€ (�Ïì(Íç£Ã¼Q€ (@ P€ (@ P€ã"ÀŽÒqaæN(@ P€ (@ P€ (@�|`Gi>æ� (@ P€ (@ P€v”Ž 3wB P€ (@ P€ (@ ä³;Jóùè0o (@ P€ (@ P€ À¸°£t\˜¹ P€ (@ P€ (@ P ŸØQšÏG‡y£(@ P€ (@ P€ ÆE€¥ãÂÌ�P€ (@ P€ (@ P€ù,ÀŽÒ|>:Ì(@ P€ (@ P€ (0.ì(fî„ (@ P€ (@ P€Ègv”æóÑaÞ(@ P€ (@ P€ (@�q`Gé¸0s' (@ P€ (@ P€ @> °£4Ÿ�óF P€ (@ P€ (@ Œ‹;JÇ…™;¡(@ P€ (@ P€ òY€¥ù|t˜7 P€ (@ P€ (@ P`\ØQ:.ÌÜ (@ P€ (@ P€ (�Ïì(Íç£Ã¼Q€ (@ P€ (@ P€ã"P4.{)°�„Ãa¼÷Þ{V*‡“C@ûþq¢&V€qpbý¹w P`t¬3ŒÎ‰kQ`,XgK]n›à 0ï“ê]v”¦’Iñúu×]‡¿ú«¿Â/~ñ‹kðe P`,Î�;‡ýû÷�å.¸m P`ÆÁapø(�W¬3äÕá`f¦ ë Sð ³Èy%À8˜Ùá`Gišn•••B¤™Š«S€  C€q°0Ž#KA P€“[ ¿¿MMMñBh"ÿò/ÿ‚ÒÒÒÈkŸþô§Q^^"fXg˜uî“ÈV€¥Ù 2=(@ P€ (@ P`þæoþ?þñ�ñ¡}(²×P(„-[¶à‚ .ÀŸÿüg\vÙexíµ×Æ1GÜ(@�ÂàÜ ã8² (@ P€ (0EÖ®]é$ýàƒ ýÓîzÔ:KµyíêÒ;ï¼sŠH°˜ r+ÀŽÒÜzrk (@ P€ (@�1¸þúë#WŽ&ÛɬY³`·Û“½Å×(@ P`v”ŽÄ·)@ P€ (@ P€ù$0þ|hÿ’MÚ“®µ1J9Q€ @úì(Mߌ)(@ P€ (@ P€*pÓM7%ÝÿÒ¥KãuJº_¤(@�”ì(MIÃ7(@ P€ (@ P€ù)póÍ7C»ÍÞ¹ýÞê u�ÞrË-Ö—¹L P€ @ èã”VVV¦¼ð¨€‹Ï¢Q€È©@^u”j%»æšk’P»ÕP¯”(@ P`ª h "íÊRë¤ asà 7X_æ2(@ P€, �Sª�OÊ“¥|�Y4 P`Üò®£ô _øJJJÖ¬Y“ð_ (@ LE�ë®»ÚíuÖI{mÅŠÖ—¹L P€ @ hw^þ×ýÇ'-àcÌ¢Q€ã'�w¥ÉÆ)ÕÆ'Õn3äD P€ "W“~ä#I ¸êª«8>i‚ _ (@ ¶À‡?üaüë¿þkÊ»3 »ô,(@�Ü ä]GiªqJ9>in<·F P€“[À:N)Ç'�ÜÇ“¹§(@ d# Ý~?mÚ´l6Á´ ( ò®£T;*ÖqJ9>)?« (@UÀ:N)Ç'U}¸D P€ (@ P ]�¼ì(µŽSÊñIÓ=¬\Ÿ  ]À:N)Ç'-ô#ÎòQ€ (@ P€c-�—¥æqJ9>éX¸} P€˜ŒÚSïÍã”r|ÒÉx™g P€ (@ P Ÿò²£Ô2Ì (@ ä‹€6™6}èCÂ-·Ü’/Ùb>(@ P€ (@ LJ�¼ì(Õ$õqJ9>é¤ü\1Ó (0Ú8¥¥¥¥‘7ÜpÃ8ì‘» (@ P€ (P¸yÛQª]sÁ`íÚµ…«Ï’Q€ ²ÐÆ)Õî¼Ðþ­X±"‹-1)(@ P€ (@ å+�6Né_üÅ_àsŸû\¾f‘ù¢(@ L¨ÀÅ_ íßüùóQ\\<¡yáÎ)@ P€ (@ Lv�¼í(­ªªÂE]„Õ«WOvc柠(0f‡ .³ísà(@ P€ ¦ŠÀòv=1U ËrR€ (@ P€ (@ P€H&�·c”&Ë,_£(@ P€ (@ P€ (0ì( Un“ (@ P€ (@ P€˜Tì(�T‡‹™¥(@ P€ (@ P€ ÆB€¥c¡ÊmR€ (@ P€ (@ P€“J€¥“êp1³ (@ P€ (@ P€ ÀX°£t,T¹M P€ (@ P€ (@ P`R °£tR.f– (@ P€ (@ P€ v”Ž…*·I P€ (@ P€ (@ L*v”NªÃÅÌR€ (@ P€ (@ P€c!P¤môüùóøæ7¿ !ÄXìƒÛ¤Fоƒ;wîÄüùóGX“oS€SIà…^@ssóT*2ËJ LR�eË–á¾û¹g¶)0z¶�GoÅ5)0l;�…*·i¸@vŽŠàW¿ún¸áó{œ§ÆIàí·ßF__þáþaœöÈÝP€“A`Á‚‘“(ÅÅÅ“!»Ì#(0…yäüîw¿Ã%—\2…Xô© À¶óT8Ê,c> °íœÏG§0ò¹¢T+Šv%Ûý÷ß_¥b)(0É´ ×ûï¿?ÉrÍìR€c-0cÆ lذ�c ÍíS€Y |ç;ßÉzÜ&‹ÛΓåH1Ÿ…(À¶s!Õü*Ç(ͯãÁÜP€ (@ P€ (@ P€ ÀŽÒ @ç.)@ P€ (@ P€ (@�ü`Gi~憠(@ P€ (@ P€˜v”N:wI P€ (@ P€ (@ ä—;Jóëx07 (@ P€ (@ P€ À°£tйK P€ (@ P€ (@ P ¿ØQš_ǃ¹¡(@ P€ (@ P€ &@€¥€Î]R€ (@ P€ (@ P€ù%ÀŽÒü:Ì (@ P€ (@ P€ (0ì(�tî’ (@ P€ (@ P€È/v”æ×ñ`n(@ P€ (@ P€ (@� `Gé s— (@ P€ (@ P€ @~ °£4¿ŽsC P€ (@ P€ (@ L€;J'�»¤(@ P€ (@ P€ òK€¥ùu<˜ P€ (@ P€ (@ P`ØQ:èÜ%(@ P€ (@ P€ (�_ì(ͯãÁÜP€ (@ P€ (@ P€ ÀŽÒ @ç.)@ P€ (@ P€ (@�ü`Gi~憠(@ P€ (@ P€˜v”N:wI P€ (@ P€ (@ ä—;Jóëx07 (@ P€ (@ P€ À°£tйK P€ (@ P€ (@ P ¿ØQš_ǃ¹¡(@ P€ (@ P€ &@€¥€Î]R€ (@ P€ (@ P€ù%ÀŽÒü:Ì (@ P€ (@ P€ (0ì(�tî’ (@ P€ (@ P€È/�¢üÊs“Oýg{1ù)��Ù%ù”3æ… (@ äH`¨½ýZ�§³g—åh£Ü (@ P€ Àd`GédŽv}U³s”�Án<·ÿ»Ø¹mú>"mp8¿?úª£6€g7W)kh ý§ãývìoNxÏå­Ç#}7)?*½xnïn4üÎT&sJÍâž±y]Š+úOâG5�¡é “xú˜;w.]´[¶+¯©B®˜â»H2F¿òjü”ò*(@ P`r œ•që»jÜš{ Ùu/Yú›OBõc?… QÑIÆ´�o|[oKŒŸú*éþí>ö¾[½{bñYOo³Ë Ýì�ÅrÚžÅrKþdÔÆ‘§þž{v !jÛ]¨¯yw¯Të"gÛ_Äwwÿ³Q&}‡‘¿²€s¯ÇƒžÍ¨Tb½²’±�²Î8\.œÚ¿?š›=Ç·bž‘’sY¨w¾ÈÏFH~6Fs¼¬û”ëj�Ǻ—)@ LŒ@!µ¯Ó�ÕY¶¯å!>ÖkÇTÆ{\‚�_cÇÍ7ÛQYžIѶ“¿Ó›¿mK‘¹ËåiÝ‘§œÅÚ‘wÅ5(�_BNO<ñ„x衇´Ù §Ñà‚�%³ü³‹Ö�ºÉ¾V¯e�h·¿S]1Ã¥pW“�ͪ¤ûHÈŸ«A Xö¨÷Œ"­]4úŒ”áNQmaŸ6Ÿ0¥0ÒʹP›oûÔ·o¾¦%ýX,t4¸LyJ<Žc±Ï©¼Í쿃SY�e§@á ,Y²Dôööæ¼€áÎÓo¼_ ì¾V˾ú„/i|óˆEmÑäu$ÍKBÌ–±½¾ÃµûÚ„'iþŒ2iÛ±{”Üæ³�¸Ookª¨m…:ü£¯sÀ‘P'2¶Ä¹tB�ZåúÚ,ÎÑn0Ü!\¦z£Ý×6Ú”\Ï"0V¿W–Ýp‘.0>õöÂi_‹Lbu–íkíC2šXo®k8ªú&üÖe‚ ÂfŠqFyb4a3g±6ËrX“�ÏwкW.O%�=õ¾Å/•_¿øÔŒŸ4ŸŽ/i—ÚþI½iÙ˜-½h4ç4Œõ“Ïu£fýZøÞ´Aþ@$N¯Ÿ‰Ü–¯¿ÑþÔfØî©Ñ‡ùÛŒ�¶9xª}0ºÎP¿W/]&m¶o5cÛÚ%øö‹f×l·™˜¾bÃÐ  £Ç?ªËò·ÂW(@ P ŠŠ/Jš­æm~˜£Ë�¼Ãb[ÒøV:ª+’îÄôb·¼%líŽ$QÛž4jã½´ÁtbÓ`;6ÏY�š¤ùÓWŠþm®Ùˆ9›ŸA,j«of¸4xòÌ\âHRçH½Á\ÔtRo}ª¿#‡lÈd*ªÀú:#õ�@ ¿Øº<“­0 (@� Fû™Æêqm_G�×zT¿Ø�ãã8±›+©Ü€ãBŽI*ÿµùäådYOÆÚ¬÷Ë P`|rt¯{n|8€ºR'6YZ,{~ØŒêÛî�<DÃk‹ÆoÝ8¯-Cû±ÃèýO À…åøÄrm á~´ù zÿ¤¾á¼JØ*çiÏfGÿ‰ç±KÙ¼ µ-?Çý«*äûC8}ø¯Þ¢n@_:{_¿g¿¾ûkƒ·Þ‹*fãÍ_ýw¨ïßs×^|öøvÌ+YŒýu¸º3„w@�éÖA‡Ç‹5—ÎÂÇìw`¶eëúb™íËhªÄ^yÛ Ñ\´¡ºn'*ο�§—¯+åv­ß†ûžÅ*ÓF»Û�á¤x!*¯^.ó'»¨{Oâ/¼€Öã§pæÜ9̽ìlØò%,·Œéelc¦M+ŽŒÏú^ûk(*Y!‡HþqéïnÇoNöêʼnÿ�Wù TÎ+à|ÿhÂû¢â6”[·9t'^=ŒæW�ã�÷eƒ¸´¥Ógaé§®ÇÚÕËS;`ä[ß}úe×Sò/(@�‚(¿�¦:8×n² QSƒOx°¹*zûY°¹!�ÂáöbË}N”Éßöà ¿íÀèûûñüß©ãfÙ\uøù÷œ¨�±a¨ÿ4ü�Û°e¿%ÆrtxïסFeÀæôb÷7 ø?ßÄÁ7BIº#ö:{°}Õ<,Ûð=Ôá× ¾ƒ;j ›¬“Ü¿³.¹·^e ° ½Ø{ÇÆ„Wݵ�pß±3Ã}8òÒ¬ß4𓝲~râU47¿Šß¿s^µ3 ô|€ù —âêUk±\ÖA¬SïÉhï~?þò…åW¶`-?ÿþÛv hýÉs*qÇÝwbÕ¤�ïXΜ=}‡››qü÷ïDÇ„—q{Öü¥¸~�Ìû¢Ä¼›Ójó½'�àß^ø~{êm™¾sþÛ¥¨¨¼×­ú$Î4=‰'ÿíw¸ü–åP•JÒÒâéÊòôâReyÄ9d±£'¡U;§M›&ë;²;üŽŸ(ŠªE‘zåðÛHÿ¸a°'Ž·ãýx]öB\y� Á<ßø2Úßî‹ìòòëîÀW6¬JYo>_|—( �\´¯Ë‘m;-«öµ<™ÇêìÚ×Úg`ÙêˆÝ;ŒáølÎjìt,þô'¼q´;öT>.5õ¿Ä®uw'>š#Ã6jtãý8q¸Í¿lÅ)ùü“R9†úÅÏÂe¶O¢bÚ›øIÝÓxoáíðVß‹òXs{èìi´ýöˆ‡ LCÅÕ+Q~h'�G÷ïj}"ËeŸHò©(ÓŠ§§?´@Ö±6y†ø*ò_@»|6w—.q¡ˆ%�IDATM·/Ùb·DÙESOô"ݾý¶{ý=ykœ£.r‰{W£[¹…JÊÅ—«[úDOÊ÷mñíw5VÇÓDÒÛ}Âz#V Îi¬Û·–»–jëmxòözË-~~Ëöe½-]ÑÂÅþš·/߯ XnTÖ6/„E�Ã(3à�°þþ€hK2$€ùö°p§ß(—É®6Ð#‚ ©†p‰`|B¤ºS³L} b—ð¦¼íÑ+zämS~ÌÇž&½€‘¿ÁÆZaOµnäu»¨M2ì@.Ê®ddr÷œ€Ìs— À˜ Œõ­¬õÆ0+¶Øo¹­º%VžáµGã’þžö�k¹øíO2lM�SÅ@@8Mq¡.‹ê=M ñÂæñ«·ÌÉ[ª«cù�Ç»W({«Û×ë$#P£>cÄíÚÖXeÇ”8XgøÊKn½u4 ·5�¦òjù¶¹|"h ¯%ÅmtF^âå•é=~Ëp=Ù¦×Ë ŠZ—µî¤æÁ檖ª”žZˆ¾€ð:MõAK¹Íed}%R�êMu^á©®.KÝÃîòˆjùzôŸGx<^ѨÀ»–5áO:d”Ìÿ0C%é[Èè¸ÉÄ­ÞÑ–WËGuj;=#yöw¬¯ò¬¸ÌÎßz{æík!#^¶í´lÚ×"G±:óöµö!Uã¼|F‰òÉ šêA‘¸c¯U†êÑVδ�ª¥èlå=æ¡îB¢Þ©ÆS-oz{<éP†£ˆ]�ZS?ˆ¬“¤¾õ>W±V›i|¿ƒcSn5¿ e/g´ž–XÃE­º¢•t¿[}=òcä¨�tfÊKÁ“vôië8ëBïàL6ÆFm ÚpêhHìlµËFK S Ä;C¢±¶ZxÜá��3Ú#|–†Š#éU!Q«tfj㹩cY©?@¾6sëf¸CÈÒQšøãÕâµ4Hd%Zoð¥7ΩñÃkÎßpÛ0¯§–¢GÔ¹-ùŠ7v\"ÐÕmäÚ’ûºXGvX´¤1F�K~ÌÓpùŽ|Æâù1Ê­½žºLæ­�Ï|ξƒã“]î…'�±îxÐãJ<¶F:ŸÜ"µ­'àbSј›ƒß~Ù‘éNø}voC‹èì3N2†‚�¢Ú#;¾|þxã%±‘�Ø ©¢�@�¥naYo £ô|ÈR¬+v˜#œdÜ8·_v½%™B­¦]×�b‰ž–tÆ'wˆ¦®è‚–2Y: ãžSi e›^+eZãÁÃ-ÎËÆó¨Ç“�›èqî„nb¹eÌ—'Ä“Ï>Qk©÷ÅÓÇê¥IŽfä¥L�›‘>iÃ7¾_ý3húkmЧÊS¾¼>Ö¿WùRNæƒãZoÏ¢}-Dö±:óöµ<–ðlK Ž}”FŠÕ™·¯å,qÞú»ÚÓd¹J^he´Þ³k£ 9š{Ê †L¿õÑ8`nû‡“Žß®·]“Œ»4jÕѼ¿Ø�ˆýÉ]¬U·›Ë¥qýæ2ãÜÖ¤ÈÑ¥òë-§þ7ÿ#öÄYõ6¹ý£¨=Ém÷2‘¿=r¨ ›c ’�š!o翱 U7oм¯nYKçź¥ÑËÈü¥z[––§æýÛ°Ú¶¥Å`ÍW6ãÛ{ŸÇ‚[Æ£»ÅmU±[ÂúßÀ¡fmmcºóæeÆB|® 79e³Î45::nOK]µé›�W\S  oÆÕZ¶ìT;’�éO / R'>y¹q[ܨ¶¡n@.•aΜ™ ¯j/8¼w¡ªÜ†M^y=�ëT�ä°[ì‘!Îy«-cÔ¹} h hm„×¥”ûïqâ¹ÓÆHs£Ê÷eWóÆ% P€SAà,^{1üâ¿Ð‘™=ø÷ö~œ|ÙrÛ}l¥öÿ×#q²ÿíGÑ|\•øýرq5Ï)ÅW­Áæ¿�ç»Àýè£xtëmñ[‘Oýæõ9ïÄUIî(+¹bd2M~üæõlŸqÆ™wM›”³¾/­J~«vÙJüo9Ä�ÇãA­ÿÛX¹eN&è?‚¯­Þ¦nD.9ÜÈ+"áNˆç~¬u>m�›’J;|æ÷µã¢Ç8‡[Þº'M¤LñkS™³M/o–ÇãNËxðv7šZ”c›7Ê!‹Ô¨½6Ïs¦ñaÏbß]–ôZdÞ}µµðU»“Ž+ßµxšR²Ñ,$v6nrW'OJþräÕ,Ž›ö�¹q“/¡lzÍÌíõÂRÝ�ÿ§¯Œ[s˜Ró- P`²i_ç"Vgܾ–f«“´P{Ž;†#G㩽�঵ê@ŽÛ¯�×5²m£âìÐjΆ­ò. íB5„z‚�™Þ !lZ*.ù°iI�]tí­–º�|¸Ø¥&y)g±vä]q ä­€Ö¥›«yõ©hvátèW:„¯Ö¸ýÛáršnSÏ,5Yn�7?Å´¯E=ããm±Þæ6ÜíêÕ„Êí` ·çÉ«/LW}˜»½ÎxY®>QÏÔ¤sÕâÈW”Zψi·ñ%\2²\9[eu­ÑkOz‚Â_W+|¾ZÑ(oËO5©Çrå°ÞZ!/ÿ7®âè^óY3y¦Îس¼JW¹ªÃ&‡‹§¿e:ãcób“| ƒ:•c{[.ÛõuÜS#÷7ÌØ¿KZ?@�ö0¦¡sxËrEiê¤çS¿•Æ;gOŸÄ»EX°d¬Ï3Jc3‰«š1#ïºÐÒõ¬Š� ]"z¾íÞÄ+o7”æ+óVc»Û†fýa]�møY» ÷V– ÿØ“ØaÚ\õß~ñ#7ø:~­Øpðû»ðrä‘z"ù€†ã{ô…Èßæ£íòê”åê@ÛUv%g\ (09®XïÄíZ¼öËßòšm±;DäˆÙ÷oÄÚßÉßfå·:VÆt~û¿iúíד¯Ù‰®Ö…p~fS|Éõزv >h‰>Œ)qóuê»ê#Ô÷F½4x';ßEÑÜX$ØŸÎ�±$•·ÆŒzêG[£ZGqÕÿwëw¹Ä¶Sµ¡ ®°ÑôDªCG;±uyU’=Ù±û‘Ûâ1qÁË•uNu ,'.Œ>}çÑ_+É{~ˆ]¥ÍÑHÅÞ‘Ïs‚úlO?]ýòAeè|EMg=jî¶”©d¶×µâ•9Ÿ‰=ärF®.ê»·b•ÜÏPû�P³ßp¼ë�]ò!dú%»JG\Ýg$wÇ-R”X®lÕ»±¡BÏw.[`Îî)¼'ÌUaN`~›ó ÀȬ}�¬bu†íë¤Gflcuæíkyk†Ý‡Î_lÅ"ýç8mÔ²+®ŽÜkD*YÇrÈq›¼“dœ·nÇÃkªâ1\;µVt�™ÉoêÔ“gñwlbmbR Œ»@No½·æþ£Ÿº Ú `ò§':i3N>µ8u�¯¨üfì4ß5vЋ_j÷š�ôc‹©‘æ‘·sÇ;Ûb›‡ì:ë•w®÷ü¡®ê|p;Í—´ÇWŒÎvàç'ä-xá0Ô»èxëÝä�ž¾®ÓêF2ø�ê?±s/ÁÒ¥‹1óáç�|Oên"K2ŸÖGúuÔ>ï$M²Å¾$ŸÌø€¹;Øýã_ÊíáùÝF8�'Àý ܦlÈÛý{j°gÏÓ?¹l:ö‘µeƒ+ÊnÊ?g)@ LR�sÓÿö;•¨)Éú›¯Â´sñHn)Ý(ûáÁW×$‰Úge€ÿ¨¿‡li€×ã†]¿Ù²'mqÇß¿‰ƒáój4ôÿ:`ºµÛœ°¿?e^¦'¿I^]IYêÇ�¾4K–.Åâù3ñÌéÿBÿ»V�"%Åð ¥XºÞ\Ñ‘aÉn±+ÂG?~¹º©ó©"ßL\¬7îdŠ¢™x[žº%ËR¦ém‘“á55昽Ú²u �K^Ûq\ŸØ8Œ¤�½Ï„º”C÷töyPnÙà@X=q}>,{Çt‹ã\>ÿbS®ËPu½Ó´ $œVÞå(0Õ2i_˨0ºvZÒX�aûZ˜ñŒÕ£o_Ûá0_ûÙìW�¤É>T™´QKlxHÞ&�z Èvï.l\kCékðŒö(ߦñ�µù&ÀüLU�tjöi�Cñüe¸E¶öï7’º7^‹ùÅ//$Ì•àsÔÊD[bïPÿóCøÓé›ÖtãþuÖ*3pø±Ï˱.£=jòöml¸·JþÛŠÝuý8xûª×Ãz¡é±]@ÕB\+ÃüñÎ8ÙÉúrn[TiÚ§6;„Wþ¹Fy;æêÈ8›Ê‹é,;Òè›=Š4í?û~ìÊ }åËq‰¼jcØ)e£jØT½YRq+äî ]<¬M�šzrüOŒ.kÿ»¿ýUµ±#Û|JH� "›Ó™0†W| 3f`†\¸Æ¹nd÷q,{<œ¡(0IúÏcéÍŸ•¹7m¸qcå‡ñ’òC­Pûí¯“¿ý›†ûí÷oÆ"5pö0>?guôJRWÂû6`û*ùïÑÝèï=�—¾ë·¨1þWÑ9x/~òZ¹5ã ”¯×Ý‹JK­fèäË–+øÄ©OÖZ³˜l¹û̬çHŸ}á7òJOí:ÇÑL6š�帣ŖŒÇ6Sl¹Ô14šÍGÖIÕ¡:Ú ¤N¯ž² È“áv¸œ p.Ŧgȸ�¹×Àa‹ÖtÔô2Ñ0±º¨¬•U‰õ½»ã—Ç踩ý½c\nž˜Ü™¶¯eœÉ0VgÞ¾®œ¸X=\ûÚñU<óì½xõ±Û•gdv­ÅÞ[úd,�Æ*튥ê“Qµ«¶BÇ5O᱿÷b¿¼Ó6õÔŒ�_ ¡C›S¶q§§¨+¤Þ&ß¡2H^3ÏpkÅJ�^ûi)�Ýé•m.ýJC;¾d/G‘öód9]^Vu|ö-Øë¸<¸e-L}mpÕ?€ súȼñP mqãCz6öCST†EË×áÑg{pñšùˆõ¥FR½þžVµ¯Äú»œòuc/ïÙ�o݇å¦öTÿ‰ƒò¸H²øë>¹0>¯Í(ryzqbOf©e¥èA° D6¦ý�z�=…»6ùÓ^µUß�ŠhâØZòO‘e;Ó-ËÆšÃÎY󘬉(ÃyeG©~¼bígÌyvã�Ï[šÊ¥³ ^/cÇ÷÷>‰U±eÝGïÉc8Ñ \½Ê²mÅ•ݺO.S€(Lk|£¨|-¼òŠÎ±º¼Ýû%yr«ÓL±P6 GëSþö»°ÙúÛ/·ÐJ¤\Ø¿6‡°9tËæ-ºÍ�¢oÙŘ³Z�)ÚnßÅ9Ùx™wõM‘+&�³ûž~»•[¸ûñôc÷h‰ŒÉ~->j.‹5nÈPké"¯˜Óà"¬rʳÀ~£Bмë[xñ«/aÝ"kP–ýÁ'ãÉqôL¶g;ªf—âÒeÙÔ`Ú¶O3´OfÈ4ɇ`þP?ó{ùªÅsã+¨U ™AsÆ­åJ8fÖúÊèÓÏšk‰ÚÞìÛ¾2ž/ef°ÇŽž>r5tkzÿ¶}8áÚ‡dwÍ÷¶ÆÏŸ{Ó?õEÜ»&±æ§ì+áJáAœngÂ3a«Z”𮑶Xý|'ý hkçæ¸�TWö¸™æ(0ErÕ¾Öì”~¬Î¦}�»X­þ.¦Ó¾–k<ÄùÈo«¶ûà‘6ŸŽÝ¶â»¸E<ígÈEuè4öþÛðìëÀ:÷A üä2tu¾…îî.¼öÿ?ݱGv¨¹¯õoÆJ½Î!ë;æéØ Ù‰R{óìoðcÓùbÌœ®TÌéôùâéÚåF¦É\o0½<ü¬µž3ÚX;üVù.òN@V5ƒá†û:E½Ç<°¾KøÛ:#üw[EKK‹vi£‡DSµ>p²öW>h¨) úôqìcã¼v5UË÷ÌëéóN°¬M¢>”BKëôµÄlYg (ä3ë•íÆÕ×"äE¥Ê{€K>ð¨K „D°©6þ�‹x¾ä@Ø}±üöuE[ U}h‘Üž»®IÚÚDk«ö¯U®�>“Slàåž`£epéÒm-~!ŸúnÉ—–O›ðwšFøèAm?�^e]»º- _�ä¡U;õÇ2ÿm­F•cd.‡\§- z’mc�“àuuÕã{3f¢ѭ ó·¹#îzé²l�–z!Ÿ/›2xÖe7r3Qs¹øNTÞ¹_ P`ìÆîá(aÑÙZ¯Ä§Ï/:Cò—w K´Ê˜ÝÒŒÄÐPgcü·W‹Z\ $Ä’.Q­<¼Çø½vÖ’%>äÀ)Z"õcuëƒüäbñ¸ÛêMŒ�._£è’OH�O“µ.Kl‘y÷¶Æb`$nÈÛh©kØ<¢IÆË¶HÌŽÆî@›Ÿ#Syƒ´â©Ï´tDëáÑl>ËCŸœuÑ8ØeyØRÄÕSõ—ÅuµŠjSÌ‹Ö;Œ¸/‡ò™í¦ýÛåîd]J œ²lm~µ\Ú,ƒ¦À�Múp—?¡>äªÕÜãQ[ôÉüÕ{]¦ü9âu·déa÷ˆ–ŽØ±Ñ픺�|è„¥Þ‘ðù±W‹ÖÎ.ÑÕÑ&üµÕJ�ÎUßa|¨4ßžŽH}G«›Ú,åQ>­"Ða<~2Ûã&Â!ð«ÚÒŽM +Zö¾Î6Ë÷H{ˆYô{¨ OÆî÷*O ÌlMY�ñª·çº}­=˜)½X�eûZ~B²‰ÕÙ¶¯µßÜ`BœwÇãMB‘qÕQÝ Ú‚�2–ç �*4,o¸‰ÇBoS§ú� [ëê–Â]�j¼uT‹€Œå=Ëå>dû¹%Ø£>\q GdÿƒÖ�ýÖzC]“¬ïÄúZÛbõ5‡"Á(�XkÙTNÇë;˜ÓLsc“JZn³þ …ƒB^[ÿˆw$Ê×Ü~óBXø]É׃ËòÔTùÄTk§¦¶]Gm[ àÄòh>ìÂ]í¾j·RiÖ�¦ÇËuZHS”I/_}0Vk—OÓKìdMQNë6eGi·å‰vúö‡ûkmx& BÉÓÛEk’‡À&>Éu„ü»ÔNhÓQIhØFÊœªƒ[&ìkU‚ˆ‘o›°ÛºÚûæÏA¶e7e}Âf³þNXιc P`,ƪ㡣Á܉eþ½wËÓ]ÆîlHÛµßáóÉ:™¤³Á�d]§hKs´=$T¾cñÑît ¯Ï+äã Û³y�F@¸3eƒÏˆ#¦²™âV›/qÛIÓÄòd~Oêl§¥Ã˼NªyWüéó}¢6¡#Ô”×$ûµûZ£f˜:‡£Nž˜NÒ�ÍO¬³2Ûô2­æ¾¦¼ÚlvµQOmü¥JŸÊM;qÔûa£ b X—ðùH•Þî�Ùiie'·¹áš*�ùõúøSé³8nr×�”Ÿ;§h•'ÌSÕ%•“ñòç㟱ú½ÊDz2OS[`\êícѾ–‡-½X�}ûZd«‡‰Uæßç¤ó± ‘†kßê¿ëMÕÉë‘x�eUÈ2XOªÚnQÛàMM~y2Õtñ”/M'ƒ#ß°a>IË-·á‹WºD½søz…uÎ$5ekÇø'b\¾ƒc\n>¿ró0§� ¯(O:oÇôz?:S­ØÚ©ŽRT�Íõ²ûU™ðܹ\yż�|˜§fìÙµÛvY.m— ]õ±.ö4xm;‹ÖíD ^vÏŽ8ÙPèÃÝò‰î‘I^/ïÔÊx²<�`¤ É+eQ'Ç_5¦~œ<Ñl,;—<§ifhíVžKoÞež’ð GíƒIo«‹¤“lx2Ø G9³N4Ëñ`''_¡(PØt¿›¢€ÇñŽiP®�3r¬“Óæå:‹¾p_äŽæÕíÞ”!lÌï¥z"_óÁ=رmö´Æ5îZgÜB]´;åCœFµÝõè“c ÆomŸž<*ùaaÑm�"Ð ï¡íä¬Å·n×oŸ�Íþ äU££šìžülkìööaêeçÏSE†-ÐÜS•~TéeŽWn­Cƒ'1ó�@³ñOSÉœµås�*½)‰2[ݸ=aüÙ’Ê[ä0MÊj)ìøú—ï…S�¦j¬b�{K{ô|dÊâ¸Éôᔟ»8Û}Z½3¶GíOèƒôólJÎY P`2 ŒEûZ:¤«³m_#ÓX=L¬Íá’+ÉM¤œôßõ5žÇê.Z¢×ßxȪ�š|×ÿlÙèÀÚµlÛc¾wðþí—¡Œ>WT‰û†}T²}h%צ¼×�íÿ]o}�°jƱ6aK|�“L@ëÇ;G¾O4Xn/“ òL¿]4t¨—’Ô[Ž¢ëAxoËwú•«ìÕ-Ãv;·z“_}¨ï#þ×î ­ækfÔ͆‚µÑýZ¯Œ�Ë®êza)’òêW¯#½36z^ì¿èïjJ8Û¤¿ù+¯ª´;œÂã«m�ª§žóNË-÷Júø2�¯°\ÙDOk’¡Ìé,óî$gœô¼hƒõæ«•R_QdN£Ýîé÷%»")fksˆê:y{Ÿåö»lË®äa‚²ÿNPƹ[ P`LÆê ­P >éÕk²CN�cšB!ûÔX‰/òViý¦ cmy׈2”Š]4w-«ésrÈyÊ+qÛI^syD§å·_ߌ6¤OÝÿßÞý…6uÅÿ)Íl Ñ¥1V"R7­teFæ‹ëƒcu{ðÉ &l°:6Ð2D†{qt°=LØtOn ÂØ�áËŠ0°7±ƒmP…µlºU±¢•(4Дµ�ýnlÓ›?'ÍŸ&½7÷)Ä“ûçœÏIrÎùåÜ{æ.ûϾ !íM~¯—Ãg?Šn7ròÒ�¼˜ž]øô¨“·®$û¢æþ‡5{䂿!kBä\–Éß/œ6ÏpìÖ}³û+©>Gþó¿:–»’y žùþ@¤÷\2U•îoÃ×ËÖ�({´÷óÔ­tl»d<-¼Dû\zû ìFß~„ÄXò\öŒœù:³ú zK€ÜnÓDò\Æeý‹¼õ½~#ãCae ŒzÓ½Œï»èiͧö%ó}ÖôVKg† }�ì Ëû¼ZßWË[*ÎŽ@®@múíÕ_ëÀµ¤¶z©Æ×%·Õޝ­.ƒñ;W/S·¯OŽ\Èêu'¿±}ñ—9Fµf”êïy‹÷s´­¿øûxî-•ò8yñ󬙧zÌî¾3z‹›ž¬cG“—m�%�–õz¡¼h™í(öÜ”ÕÖÚ°ôÏkó\ú|sD÷¬°²zöìY‘'NhÚ9�Ÿ�í–W>œËP·\™�Ý¡ùÓEnÿ#S¾5ÒéÐîËøƒ˜Î ˜’™ÔOJ>Y¿±]ÚÂówHÎw¬¸\úd¿D¿üW_œ›ÍÑ¡Ü� 9~@ö¿ùª<·:!¿ö÷ËÕ¿Dö}tHv„²ojœï¸ÞK»?zSQðIpÓ ûK0š�Ëýñ ‰MΈϺɴ.ˆli‘P P½¹ÛשŸAw«’{Ü/ÐÞÞ.ׯ_—µk×:¿0�´�^÷ZzVœþ¸)ŸZ ~VÝ‘tQÅ5;¥c�Èý;ãÓÙsSV£ýŸ~ý‡ÖKû–6)Ô„Lß¾$oo‰Š}^†¶Ú"Ñ#òñûåÕ�ÏIâ¯_¥ÿ§«"/ì“Cûv,ÌJ]BÕø£;:å®Î`yF�ê“æ5kdý† ò§ç±8Û¬vYÆåalRwõ¥fÁƒ$rG»·ú[c©r[…lZ”–u¡‚õfÇÈ·k8´0ؾq¾çÓqyô8þô}£~«ý-(Ê=ßÁJIsw½•RÒb¶uÕ÷U1b ®î·—ÚV/ÉøZÄ)mµ¡J‹K.yŒú´Ÿó@ܤ}™&Ýâác™LL¦c«×o�¶"ÚúiícŒÅÚEðIS‹öÅô-Š+VÑ[-[[››CWs‹CŠJˆ^Õ"÷ºjÚíq™µ†0SÃr2$µÎ½]B©‹ó C²m§-’ K‡þ•òøãëC$µ·tï¹Ë¿O}¬—ñÛßÕ—úŸÝ)æÕ^K9qnîØ¦«%—ñhðK¸MÿÊØ•]@j'�ê¸OÎJ“6ÛÃß~•’Z9hßþ¬Ä§u�]c_¾AB›·éßB~Û;Jû)³‚¤ÖÑR?sêåmïè_æcHvN,¬(›ùbEÿó‡Úô‡Ó¶2�Ñ �p›þ•¹û2ïæ×ŒwT�ùJ÷—F¿„ þ^- w×[µT8.8K ¢¶z Æ×â ¶º¢š)yŒ:×Ï™?iÉûÏï(Ò¨ý‹[˜cá•>[¶¶¶†eäTÌ 8(P:+—>j’hö˜&]U§$²î”ô]“/ö”;IÌðä‰üòÃw†×ò'¿ü¼ fùäÏ:© €”-0{ç’4mÒeq �o¢ùFúd,ù…T«ÕŽÿ9(¥µÚÛem“!Ã$#€ Pg´ÕuV¡j"à @©.ô4¼x™‡n<©Z Ô//½¡ƒ¾AkFiDúΓw÷tIkóŒÜýM/÷ËÀÐßòo,&Á`Dö蕃ûlSaÏ>[ € P‰ØXå’»Otñˆ@›–±‰ãKb…jS­vOŸ;ü®tmm•™Ç÷ä·Ÿ¥ÿÊ€ ݰn¥”Èî=Ò{ø lvPϧŒ"³  €E ÐVMņ €@ZÀAÃ…€-H™Î_Γ·^ßš“¶t ²ëÃ%ñ¾.ùë÷gÜ+Ú+Ûví•—îd @× Øƒ”ÆBDß’«$M�3´K~œIH\%÷Û¯ñd¯^Ö¿÷=ZmcÝð €@Ý ÐV×}S@¨‚€ƒ¥ò4HÙ×E |ú/ó1£ ;ø|¼4Þë,sûJþרAR € P@À R&5H·ÚçœV[*ðe/ ª¢—­ß6y € €@¶mu¶ÿGpT ÔÊm£Þ$8_,´±ÒE¹Ø@¬ eÞV»&?l.äƒg € �_€¶:¿ © €@~�•ù“IE@@@@¼#@ Ô;uMI@@@@@À @ ÔC2 € € € €xG€@©wêš’"€ € € € €€A€@©†d@@@@ðŽ�RïÔ5%E@@@@ƒ�R É € € € € à¥Þ©kJŠ € € € €¥’@@@@@À;J½S×”@@@@ J 0$#€ € € € €€w”z§®)) € € € €”`HF@@@@ï(õN]SR@@@@0(5À�Œ € € € €Þ Pê�º¦¤ € € € € ` Pj€!@@@@¼#@ Ô;uMI@@@@@À @ ÔC2 € € € €xG€@©wêš’"€ € € € €€A ÁJonn–“'O6!ª-011!­­­Õ> ÇG— ܺuKŽ=*---.Ë9ÙE¯ XßW+W2ÃkõîÅò2vöb­Sf' 0vvRmÔg^V$õaíüùó255UŸ¥¤T¸@ §§GV­Z傜’E¨•Àèè¨\»v­V§ã< €@Ù���ÒÕÕUöþ숀›;»©¶Èk= 0v®ÇZuN™Ò�Rçd‰œ € € € € €µø(ø¹C»vzIEND®B`‚DBI/vignettes/biblio.bib0000644000176200001440000001772214350241735014613 0ustar liggesusers@string{jcgs="Journal of Computational and Graphical Statistics"} @inproceedings{s-corba.98, author = "Chambers, John M. and Hansen, Mark H. and James, David A. and Temple Lang, Duncan", title = "Distributed Computing with Data: A CORBA-based Approach", booktitle = "Computing Science and Statistics", year = 1998, organization = "Inteface Foundation of North America" } @book{S.88, author = "Becker, R. A. and Chambers, J. M. and Wilks, A. R", year = "1988", title = "The New S Language", publisher = "Wadsworth", address = "Pacific Grove, California" } @book{S.92, editor = "Chambers, J. M. and Hastie, T.", year = 1992, title = "Statistical Models in S", publisher = "Wadsworth", address = "Pacific Grove, California" } @book{S4, author = "Chambers, J. M.", title = "Programming with Data: A Guide to the S Language", publisher = "Springer", address = "New York", year = 1998 } @article{R.96, author = "Ihaka, Ross and Gentleman, Robert", title = "R: A Language for Data Analysis and Graphics", journal = jcgs, volume = 5, number = 3, year = 1996, pages = "299-314" } @book{corba:siegel.96, author = "Siegel, Jon", title = "CORBA Fundamentals and Programming", publisher = "Wiley", address = "New York", year = 1996 } @book{pvm, title = "PVM: Parallel Virtual Machine. A User's Guide and Tutorial for Networked Parallel Computing", author="Geist, A. and Beguelin, A. and Dongarra, J. and Jiang, W. and Mancheck, R. and Sunderam, V.", year = 1994, publisher = "MIT Press", address = "Cambridge, MA" } @manual{splus, title = "S-PLUS Software Documentation", key = "S-PLUS", organization = "StatSci Division of MathSoft Inc.", note = "Version 3.3", year = 1995, address = "Seattle, WA", } @book{tierney.90, author = "Tierney, Luke", year = 1990, title = "LISP-STAT: An Object-Oriented Environment for Statistical Computing and Dynamic Graphics", publisher = "Wiley", address = "New York" } @article{tierney.96, author = "Tierney, Luke", title = "Recent Development and Future Directions in {LispStat}", journal = jcgs, volume = 5, number = 3, year = 1996, pages = "250-262" } @article{odbc.lj, author = "Harvey, Peter", title = "{Open Database Connectivity}", journal = "{Linux Journal}", year = 1999, volume = "Nov.", number = 67, pages = "68-72" } @article{duncan2000, author = "Temple Lang, Duncan", title = "{The Omegahat Environment: New Possibilities for Statistical Computing}", journal = jcgs, volume = "to appear", year = 2000, number = "" } @manual{sql92, title = "{X/Open CAE Specification: SQL and RDA}", organization = "X/Open Company Ltd.", address = "Reading, UK", year = 1994 } @book{MySQL, author = "DuBois, Paul", title = "{MySQL}", publisher = "New Riders Publishing", year = 2000 } @manual{R.ext, title = "Writing {R} Extensions", organization = "{R} Development Core Team", note = "Version 1.2.1 (2001-01-15)", year = 2001 } @manual{R.imp-exp, title = "{R} Data Import/Export", organization = "R-Development Core Team", note = "Version 1.2.1 (2001-01-15)", year = 2001 } @manual{R-dbms, title = "Using Relational Database Systems with {R}", organization = "R-Developemt Core Team", note = "Draft", year = 2000 } @manual{bates.mysql, title = "Using Relational Database Systems with {R}", organization = "R-Developemt Core Team", note = "Draft", year = 2000 } @techreport{proxyDBMS, author = "James, David A.", title = "Proxy Database Object in the S Language", institution = "Bell Labs, Lucent Technologies", year = "In preparation" } @techreport{RS-DBI, author = "James, David A.", title = "A Common Interface to Relational Database Management Sysmtems from {R} and {S} --- A Proposal", institution = "Bell Labs, Lucent Technologies", year = "2000", address = "www.omegahat.org" } @techreport{RS-MySQL, author = "James, David A.", title = "An {R}/{S} Interface to the {MySQL} Database", institution = "Bell Labs, Lucent Technologies", year = "2001", address = "www.omegahat.org" } @techreport{RS-Oracle, author = "James, David A.", title = "An {R}/{S} Interface to the {Oracle} Database", institution = "Bell Labs, Lucent Technologies", year = "In preparation", address = "www.omegahat.org" } @manual{r-data-imp:2001, author = {R Development Core Team}, title = {R Data Import/Export}, year = {2001}, address = {\url{https://www.r-project.org}} } @manual{mysql:2000, author = "Axmark, David and Widenius, Michael and Cole, Jeremy and DuBois, Paul", title = {MySQL Reference Manual}, year = {2001}, address = {\url{https://www.mysql.com/documentation/mysql}} } @manual{jdbc:2000, author = "Ellis, Jon and Ho, Linda and Fisher, Maydene", title = {JDBC 3.0 Specification}, organization = {Sun Microsystems, Inc}, year = {2000}, address = {\url{https://java.sun.com/Download4}} } @article{using-data:2001, author = "Ripley, Brian D.", title = {Using Databases with {R}}, journal = {R {N}ews}, year = {2001}, month = {January}, volume = {1}, number = {1}, pages = {18--20}, address = {\url{https://www.r-project.org/doc/Rnews/}} } @Manual{odbc:2001, title = {Microsoft {ODBC}}, organization = {Microsoft Inc}, address = {\url{https://www.microsoft.com/data/odbc/}}, year = 2001 } @Book{PerlDBI:2000, author = "Descartes, Alligator and Bunce, Tim", title = {Programming the {P}erl {DBI}}, publisher = {O'Reilly}, year = 2000 } @Book{Reese:2000, author = "Reese, George", title = {Database Programming with {JDBC} and {J}ava}, publisher = {O'Reilly}, year = 2000, edition = {second} } @book{Xopen-sql, author = {X/Open Company Ltd.}, title = {X/Open SQL and RDA Specification}, publisher = {X/Open Company Ltd.}, year = 1994 } @book{mysql-dubois, author = "DuBois, Paul", title = {MySQL}, publisher = {New Riders}, year = 2000 } @techreport{data-management:1991, author = "Chambers, John M.", title = {Data Management in {S}}, institution = {Bell Labs, Lucent Technologies}, year = 1991 } @techreport{database-classes:1999, author = "Chambers, John M.", title = {Database Classes}, institution = {Bell Labs, Lucent Technologies}, year = 1998 } @inproceedings{R-dcom, author = "Neuwirth, Erich and Baier, Thomas", title = {Embedding {R} in Standard Software, and the other way around}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{R-tcltk, author = "Dalgaard, Peter", title = {The {R}-{T}cl/{T}k Interface}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{duncan-dsc2001, author = "Temple Lang, Duncan", title = {Embedding {S} in Other Languages and Environments}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{BDR-RMR, author = "Ripley, B. D. and Ripley, R. M.", title = {Applications of {R} Clients and Servers}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{rsdbi-dsc2001, author = "Hothorn, Torsten and James, David A. and Ripley, Brian D.", title = {{R}/{S} Interfaces to Databases}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } DBI/vignettes/DBI-advanced.Rmd0000644000176200001440000002655715143057347015515 0ustar liggesusers--- title: "Advanced DBI Usage" author: "James Wondrasek, Kirill Müller" date: "17/03/2020" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Advanced DBI Usage} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} library(knitr) opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) knit_print.data.frame <- function(x, ...) { print(head(x, 3)) if (nrow(x) > 3) { cat("Showing 3 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ``` ## Who this tutorial is for This tutorial is for you if you need to use a richer set of SQL features such as data manipulation queries, parameterized queries and queries performed using SQL's transaction features. See `vignette("DBI", package = "DBI")` for a more basic tutorial covering connecting to DBMS and executing simple queries. ## How to run more complex queries using DBI `dbGetQuery()` works by calling a number of functions behind the scenes. If you need more control you can manually build your own query, retrieve results at your selected rate, and release the resources involved by calling the same functions. These functions are: - `dbSendQuery()` sends the SQL query to the DBMS and returns a `result` object. The query is limited to `SELECT` statements. If you want to send other statements, such as `INSERT`, `UPDATE`, `DELETE`, etc, use `dbSendStatement()`. - `dbFetch()` is called with the `result` object returned by `dbSendQuery()`. It also accepts an argument specifying the number of rows to be returned, e.g. `n = 200`. If you want to fetch all the rows, use `n = -1`. - `dbClearResult()` is called when you have finished retrieving data. It releases the resources associated with the `result` object. ```{r} library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = 'G'") df <- dbFetch(res, n = 3) dbClearResult(res) head(df, 3) ``` ## How to read part of a table from a database If your dataset is large you may want to fetch a limited number of rows at a time. As demonstrated below, this can be accomplished by using a while loop where the function `dbHasCompleted()` is used to check for ongoing rows, and `dbFetch()` is used with the `n = X` argument, specifying how many rows to return on each iteration. Again, we call `dbClearResult()` at the end to release resources. ```{r} res <- dbSendQuery(con, "SELECT * FROM film") while (!dbHasCompleted(res)) { chunk <- dbFetch(res, n = 300) print(nrow(chunk)) } dbClearResult(res) ``` ## How to use parameters (safely) in SQL queries `dbSendQuery()` can be used with parameterized SQL queries. DBI supports two ways to avoid SQL injection attacks from user-supplied parameters: quoting and parameterized queries. ### Quoting Quoting of parameter values is performed using the function `dbQuoteLiteral()`, which supports many R data types, including date and time.[^quote-string] [^quote-string]: An older method, `dbQuoteString()`, was used to quote string values only. The `dbQuoteLiteral()` method forwards to `dbQuoteString()` for character vectors. Users do not need to distinguish between these two cases. In cases where users may be supplying table or column names to use in the query for data retrieval, those names or identifiers must also be escaped. As there may be DBMS-specific rules for escaping these identifiers, DBI provides the function `dbQuoteIdentifier()` to generate a safe string representation. ```{r quote} safe_id <- dbQuoteIdentifier(con, "rating") safe_param <- dbQuoteLiteral(con, "G") query <- paste0("SELECT title, ", safe_id, " FROM film WHERE ", safe_id, " = ", safe_param) query res <- dbSendQuery(con, query) dbFetch(res) dbClearResult(res) ``` The same result can be had by using `glue::glue_sql()`. It performs the same safe quoting on any variable or R statement appearing between braces within the query string. ```{r} id <- "rating" param <- "G" query <- glue::glue_sql("SELECT title, {`id`} FROM film WHERE {`id`} = {param}", .con = con) df <- dbGetQuery(con, query) head(df, 3) ``` ### Parameterized queries Rather than performing the parameter substitution ourselves, we can push it to the DBMS by including placeholders in the query. Different DBMS use different placeholder schemes, DBI passes through the SQL expression unchanged. MariaDB uses a question mark (?) as placeholder and expects an unnamed list of parameter values. Other DBMS may use named parameters. We recommend consulting the documentation for the DBMS you are using. As an example, a web search for "mariadb parameterized queries" leads to the documentation for the [`PREPARE` statement](https://mariadb.com/docs/server/reference/sql-statements/prepared-statements/prepare-statement) which mentions: > Within the statement, "?" characters can be used as parameter markers to indicate where data values are to be bound to the query later when you execute it. Currently there is no list of which placeholder scheme a particular DBMS supports. Placeholders only work for literal values. Other parts of the query, e.g. table or column identifiers, still need to be quoted with `dbQuoteIdentifier()`. For a single set of parameters, the `params` argument to `dbSendQuery()` or `dbGetQuery()` can be used. It takes a list and its members are substituted in order for the placeholders within the query. ```{r params} params <- list("G") safe_id <- dbQuoteIdentifier(con, "rating") query <- paste0("SELECT * FROM film WHERE ", safe_id, " = ?") query res <- dbSendQuery(con, query, params = params) dbFetch(res, n = 3) dbClearResult(res) ``` Below is an example query using multiple placeholders with the MariaDB driver. The placeholders are supplied as a list of values ordered to match the position of the placeholders in the query. ```{r multi-param} q_params <- list("G", 90) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ``` When you wish to perform the same query with different sets of parameter values, `dbBind()` is used. There are two ways to use `dbBind()`. Firstly, it can be used multiple times with same query. ```{r dbbind} res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list("G")) dbFetch(res, n = 3) dbBind(res, list("PG")) dbFetch(res, n = 3) dbClearResult(res) ``` Secondly, `dbBind()` can be used to execute the same statement with multiple values at once. ```{r bind_quotestring} res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list(c("G", "PG"))) dbFetch(res, n = 3) dbClearResult(res) ``` Use a list of vectors if your query has multiple parameters: ```{r bind-multi-param} q_params <- list(c("G", "PG"), c(90, 120)) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ``` Always disconnect from the database when done. ```{r disconnect} dbDisconnect(con) ``` ## SQL data manipulation - UPDATE, DELETE and friends For SQL queries that affect the underlying database, such as UPDATE, DELETE, INSERT INTO, and DROP TABLE, DBI provides two functions. `dbExecute()` passes the SQL statement to the DBMS for execution and returns the number of rows affected. `dbSendStatement()` performs in the same manner, but returns a result object. Call `dbGetRowsAffected()` with the result object to get the count of the affected rows. You then need to call `dbClearResult()` with the result object afterwards to release resources. In actuality, `dbExecute()` is a convenience function that calls `dbSendStatement()`, `dbGetRowsAffected()`, and `dbClearResult()`. You can use these functions if you need more control over the query process. The subsequent examples use an in-memory SQL database provided by `RSQLite::SQLite()`, because the remote database used in above examples does not allow writing. ```{r} library(DBI) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (4, 4), (5, 5), (6, 6)" ) dbGetRowsAffected(rs) dbClearResult(rs) dbReadTable(con, "cars") ``` Do not forget to disconnect from the database at the end. ```{r} dbDisconnect(con) ``` ## SQL transactions with DBI DBI allows you to group multiple queries into a single atomic transaction. Transactions are initiated with `dbBegin()` and either made persistent with `dbCommit()` or undone with `dbRollback()`. The example below updates two tables and ensures that either both tables are updated, or no changes are persisted to the database and an error is thrown. ```{r} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) withdraw <- function(amount) { # All operations must be carried out as logical unit: dbExecute(con, "UPDATE cash SET amount = amount + ?", list(amount)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(amount)) } withdraw_transacted <- function(amount) { # Ensure atomicity dbBegin(con) # Perform operation withdraw(amount) # Persist results dbCommit(con) } withdraw_transacted(300) ``` After withdrawing 300 credits, the cash is increased and the account is decreased by this amount. The transaction ensures that either both operations succeed, or no change occurs. ```{r} dbReadTable(con, "cash") dbReadTable(con, "account") ``` We can roll back changes manually if necessary. Do not forget to call `dbRollback()` in case of error, otherwise the transaction remains open indefinitely. ```{r} withdraw_if_funds <- function(amount) { dbBegin(con) withdraw(amount) # Rolling back after detecting negative value on account: if (dbReadTable(con, "account")$amount >= 0) { dbCommit(con) TRUE } else { message("Insufficient funds") dbRollback(con) FALSE } } withdraw_if_funds(5000) dbReadTable(con, "cash") dbReadTable(con, "account") ``` `dbWithTransaction()` simplifies using transactions. Pass it a connection and the code you want to run as a transaction. It will execute the code and call `dbCommit()` on success and call `dbRollback()` if an error is thrown. ```{r error = TRUE} withdraw_safely <- function(amount) { dbWithTransaction(con, { withdraw(amount) if (dbReadTable(con, "account")$amount < 0) { stop("Error: insufficient funds", call. = FALSE) } }) } withdraw_safely(5000) dbReadTable(con, "cash") dbReadTable(con, "account") ``` As usual, do not forget to disconnect from the database when done. ```{r} dbDisconnect(con) ``` ## Conclusion That concludes the major features of DBI. For more details on the library functions covered in this tutorial and the `vignette("DBI", package = "DBI")` introductory tutorial see the DBI specification at `vignette("spec", package = "DBI")`. If you are after a data manipulation library that works at a higher level of abstraction, check out [dplyr](https://dplyr.tidyverse.org). It is a grammar of data manipulation that can work with local dataframes and remote databases and uses DBI under the hood. DBI/vignettes/DBI-history.Rmd0000644000176200001440000001221414602466070015426 0ustar liggesusers--- title: "History of DBI" author: "David James" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{History of DBI} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- The following history of DBI was contributed by David James, the driving force behind the development of DBI, and many of the packages that implement it. The idea/work of interfacing S (originally S3 and S4) to RDBMS goes back to the mid- and late 1990's in Bell Labs. The first toy interface I did was to implement John Chamber's early concept of "Data Management in S" (1991). The implementation followed that interface pretty closely and immediately showed some of the limitations when dealing with very large databases; if my memory serves me, the issue was the instance-based of the language back then, e.g., if you attached an RDBMS to the `search()` path and then needed to resolve a symbol "foo", you effectively had to bring all the objects in the database to check their mode/class, i.e., the instance object had the metadata in itself as attributes. The experiment showed that the S3 implementation of "data management" was not really suitable to large external RDBMS (probably it was never intended to do that anyway). (Note however, that since then, John and Duncan Temple Lang generalized the data management in S4 a lot, including Duncan's implementation in his RObjectTables package where he considered a lot of synchronization/caching issues relevant to DBI and, more generally, to most external interfaces). Back then we were working very closely with Lucent's microelectronics manufacturing --- our colleagues there had huge Oracle (mostly) databases that we needed to constantly query via [SQL*Plus](https://en.wikipedia.org/wiki/SQL*Plus). My colleague Jake Luciani was developing advanced applications in C and SQL, and the two of us came up with the first implementation of S3 directly connecting with Oracle. What I remember is that the Linux [PRO*C](https://en.wikipedia.org/wiki/Pro*C) pre-compiler (that embedded SQL in C code) was very buggy --- we spent a lot of time looking for workarounds and tricks until we got the C interface running. At the time, other projects within Bell Labs began using MySQL, and we moved to MySQL (with the help of Doug Bates' student Saikat DebRoy, then a summer intern) with no intentions of looking back at the very difficult Oracle interface. It was at this time that I moved all the code from S3 methods to S4 classes and methods and begun reaching out to the S/R community for suggestions, ideas, etc. All (most) of this work was on Bell Labs versions of S3 and S4, but I made sure it worked with S-Plus. At some point around 2000 (I don't remember exactly when), I ported all the code to R regressing to S3 methods, and later on (once S4 classes and methods were available in R) I re-implemented everything back to S4 classes and methods in R (a painful back-and-forth). It was at this point that I decided to drop S-Plus altogether. Around that time, I came across a very early implementation of SQLite and I was quite interested and thought it was a very nice RDBMS that could be used for all kinds of experimentation, etc., so it was pretty easy to implement on top of the DBI. Within the R community, there were quite a number of people that showed interest on defining a common interface to databases, but only a few folks actually provided code/suggestions/etc. (Tim Keitt was most active with the dbi/PostgreSQL packages --- he also was considering what he called "proxy" objects, which was reminiscent of what Duncan had been doing). Kurt Hornick, Vincent Carey, Robert Gentleman, and others provided suggestions/comments/support for the DBI definition. By around 2003, the DBI was more or less implemented as it is today. I'm sure I'll forget some (most should be in the THANKS sections of the various packages), but the names that come to my mind at this moment are Jake Luciani (ROracle), Don MacQueen and other early ROracle users (super helpful), Doug Bates and his student Saikat DebRoy for RMySQL, Fei Chen (at the time a student of Prof. Ripley) also contributed to RMySQL, Tim Keitt (working on an early S3 interface to PostgrSQL), Torsten Hothorn (worked with mSQL and also MySQL), Prof. Ripley working/extending the RODBC package, in addition to John Chambers and Duncan Temple-Lang who provided very important comments and suggestions. Actually, the real impetus behind the DBI was always to do distributed statistical computing --- *not* to provide a yet-another import/export mechanism --- and this perspective was driven by John and Duncan's vision and work on inter-system computing, COM, CORBA, etc. I'm not sure many of us really appreciated (even now) the full extent of those ideas and concepts. Just like in other languages (C's ODBC, Java's JDBC, Perl's DBI/DBD, Python dbapi), R/S DBI was meant to unify the interfacing to RDBMS so that R/S applications could be developed on top of the DBI and not be hard coded to any one relation database. The interface I tried to follow the closest was the Python's DBAPI --- I haven't worked on this topic for a while, but I still feel Python's DBAPI is the cleanest and most relevant for the S language. DBI/vignettes/DBI.Rmd0000644000176200001440000001624315005325062013726 0ustar liggesusers--- title: "Introduction to DBI" author: "James Wondrasek, Katharina Brunner, Kirill Müller" date: "27 February 2020" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Introduction to DBI} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) ``` ## Who this tutorial is for This tutorial is for you if you want to access or manipulate data in a database that may be on your machine or on a different computer on the internet, and you have found libraries that use a higher level of abstraction, such as [dbplyr](https://dbplyr.tidyverse.org/), are not suitable for your purpose. Depending on what you want to achieve, you may find it useful to have an understanding of SQL before using DBI. The DBI (**D**ata**B**ase **I**nterface) package provides a simple, consistent interface between R and database management systems (DBMS). Each supported DBMS is supported by its own R package that implements the DBI specification in `vignette("spec", package = "DBI")`. DBI currently supports about 30 DBMS, including: * MySQL, using the R-package [RMySQL](https://github.com/r-dbi/RMySQL) * MariaDB, using the R-package [RMariaDB](https://github.com/r-dbi/RMariaDB) * Postgres, using the R-package [RPostgres](https://github.com/r-dbi/RPostgres) * SQLite, using the R-package [RSQLite](https://github.com/r-dbi/RSQLite) For a more complete list of supported DBMS visit [https://github.com/r-dbi/backends](https://github.com/r-dbi/backends#readme). You may need to install the package specific to your DBMS. The functionality currently supported for each of these DBMS's includes: - manage a connection to a database - list the tables in a database - list the column names in a table - read a table into a data frame For more advanced features, such as parameterized queries, transactions, and more see `vignette("DBI-advanced", package = "DBI")`. ## How to connect to a database using DBI The following code establishes a connection to the Sakila database hosted by the Relational Dataset Repository at `https://relational-data.org/dataset/Sakila`, lists all tables on the database, and closes the connection. The database represents a fictional movie rental business and includes tables describing films, actors, customers, stores, etc.: ```{r} library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListTables(con) dbDisconnect(con) ``` Connections to databases are created using the `dbConnect()` function. The first argument to the function is the driver for the DBMS you are connecting to. In the example above we are connecting to a MariaDB instance, so we use the `RMariaDB::MariaDB()` driver. The other arguments depend on the authentication required by the DBMS. In the example host, port, username, password, and dbname are required. See the documentation for the DBMS driver package that you are using for specifics. The function `dbListTables()` takes a database connection as its only argument and returns a character vector with all table and view names in the database. After completing a session with a DBMS, always release the connection with a call to `dbDisconnect()`. ### Secure password storage The above example contains the password in the code, which should be avoided for databases with secured access. One way to use the credentials securely is to store it in your system's credential store and then query it with the [keyring](https://github.com/r-lib/keyring#readme) package. The code to connect to the database could then look like this: ```{r eval = FALSE} con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = keyring::key_get("relational.fel.cvut.cz", "guest"), dbname = "sakila" ) ``` ## How to retrieve column names for a table We can list the column names for a table with the function `dbListFields()`. It takes as arguments a database connection and a table name and returns a character vector of the column names in order. ```{r} con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListFields(con, "film") ``` ## Read a table into a data frame The function `dbReadTable()` reads an entire table and returns it as a data frame. It is equivalent to the SQL query `SELECT * FROM `. The columns of the returned data frame share the same names as the columns in the table. DBI and the database backends do their best to coerce data to equivalent R data types. ```{r} df <- dbReadTable(con, "film") head(df, 3) ``` ## Read only selected rows and columns into a data frame To read a subset of the data in a table into a data frame, DBI provides functions to run custom SQL queries and manage the results. For small datasets where you do not need to manage the number of results being returned, the function `dbGetQuery()` takes a SQL `SELECT` query to execute and returns a data frame. Below is a basic query that specifies the columns we require (`film_id`, `title` and `description`) and which rows (records) we are interested in. Here we retrieve films released in the year 2006. ```{r} df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006") head(df, 3) ``` We could also retrieve movies released in 2006 that are rated "G". Note that character strings must be quoted. As the query itself is contained within double quotes, we use single quotes around the rating. See `dbQuoteLiteral()` for programmatically converting arbitrary R values to SQL. This is covered in more detail in `vignette("DBI-advanced", package = "DBI")`. ```{r} df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006 AND rating = 'G'") head(df, 3) ``` The equivalent operation using `dplyr` reconstructs the SQL query using three functions to specify the table (`tbl()`), the subset of the rows (`filter()`), and the columns we require (`select()`). Note that dplyr takes care of the quoting. ```{r message=FALSE} library(dplyr) lazy_df <- tbl(con, "film") %>% filter(release_year == 2006 & rating == "G") %>% select(film_id, title, description) head(lazy_df, 3) ``` If you want to perform other data manipulation queries such as `UPDATE`s and `DELETE`s, see `dbSendStatement()` in `vignette("DBI-advanced", package = "DBI")`. ## How to end a DBMS session When finished accessing the DBMS, always close the connection using `dbDisconnect()`. ```{r} dbDisconnect(con) ``` ## Conclusion This tutorial has given you the basic techniques for accessing data in any supported DBMS. If you need to work with databases that will not fit in memory, or want to run more complex queries, including parameterized queries, please see `vignette("DBI-advanced", package = "DBI")`. ## Further Reading * An overview on [working with databases in R on Rstudio.com](https://db.rstudio.com/) * The DBI specification: `vignette("spec", package = "DBI")` * [List of supported DBMS](https://github.com/r-dbi/backends#readme) DBI/vignettes/DBI-proposal.Rmd0000644000176200001440000006635215143057347015604 0ustar liggesusers--- title: "A Common Interface to Relational Databases from R and S -- A Proposal" author: "David James" date: "March 16, 2000" output: rmarkdown::html_vignette bibliography: biblio.bib vignette: > %\VignetteIndexEntry{A Common Interface to Relational Databases from R and S -- A Proposal} %\VignetteEngine{knitr::rmarkdown} --- For too long S and similar data analysis environments have lacked good interfaces to relational database systems (RDBMS). For the last twenty years or so these RDBMS have evolved into highly optimized client-server systems for data storage and manipulation, and currently they serve as repositories for most of the business, industrial, and research “rawâ€� data that analysts work with. Other analysis packages, such as SAS, have traditionally provided good data connectivity, but S and GNU R have relied on intermediate text files as means of importing data (but see @R.imp-exp and @R-dbms.) Although this simple approach works well for relatively modest amounts of mostly static data, it does not scale up to larger amounts of data distributed over machines and locations, nor does it scale up to data that is highly dynamic – situations that are becoming increasingly common. We want to propose a common interface between R/S and RDBMS that would allow users to access data stored on database servers in a uniform and predictable manner irrespective of the database engine. The interface defines a small set of classes and methods similar in spirit to Python’s DB-API, Java’s JDBC, Microsoft’s ODBC, Perl’s DBI, etc., but it conforms to the “whole-objectâ€� philosophy so natural in S and R. # Computing with Distributed Data {#sec:distr} As data analysts, we are increasingly faced with the challenge of larger data sources distributed over machines and locations; most of these data sources reside in relational database management systems (RDBMS). These relational databases represent a mature client-server distributed technology that we as analysts could be exploiting more that we’ve done in the past. The relational technology provides a well-defined standard, the ANSI SQL-92 @sql92, both for defining and manipulating data in a highly optimized fashion from virtually any application. In contrast, S and Splus have provided somewhat limited tools for coping with the challenges of larger and distributed data sets (Splus does provide an `import` function to import from databases, but it is quite limited in terms of SQL facilities). The R community has been more resourceful and has developed a number of good libraries for connecting to mSQL, MySQL, PostgreSQL, and ODBC; each library, however, has defined its own interface to each database engine a bit differently. We think it would be to everybody’s advantage to coordinate the definition of a common interface, an effort not unlike those taken in the Python and Perl communities. The goal of a common, seamless access to distributed data is a modest one in our evolution towards a fully distributed computing environment. We recognize the greater goal of distributed computing as the means to fully integrate diverse systems – not just databases – into a truly flexible analysis environment. Good connectivity to databases, however, is of immediate necessity both in practical terms and as a means to help us transition from monolithic, self-contained systems to those in which computations, not only the data, can be carried out in parallel over a wide number of computers and/or systems @duncan2000. Issues of reliability, security, location transparency, persistence, etc., will be new to most of us and working with distributed data may provide a more gradual change to ease in the ultimate goal of full distributed computing. # A Common Interface {#sec:rs-dbi} We believe that a common interface to databases can help users easily access data stored in RDBMS. A common interface would describe, in a uniform way, how to connect to RDBMS, extract meta-data (such as list of available databases, tables, etc.) as well as a uniform way to execute SQL statements and import their output into R and S. The current emphasis is on querying databases and not so much in a full low-level interface for database development as in JDBC or ODBC, but unlike these, we want to approach the interface from the “whole-objectâ€� perspective @S4 so natural to R/S and Python – for instance, by fetching all fields and records simultaneously into a single object. The basic idea is to split the interface into a front-end consisting of a few classes and generic functions that users invoke and a back-end set of database-specific classes and methods that implement the actual communication. (This is a very well-known pattern in software engineering, and another good verbatim is the device-independent graphics in R/S where graphics functions produce similar output on a variety of different devices, such X displays, Postscript, etc.) The following verbatim shows the front-end: ``` > mgr <- dbManager("Oracle") > con <- dbConnect(mgr, user = "user", passwd = "passwd") > rs <- dbExecStatement(con, "select fld1, fld2, fld3 from MY_TABLE") > tbls <- fetch(rs, n = 100) > hasCompleted(rs) [1] T > close(rs) > rs <- dbExecStatement(con, "select id_name, q25, q50 from liv2") > res <- fetch(rs) > getRowCount(rs) [1] 73 > close(con) ``` Such scripts should work with other RDBMS (say, MySQL) by replacing the first line with ``` > mgr <- dbManager("MySQL") ``` ## Interface Classes {#sec:rs-dbi-classes} The following are the main RS-DBI classes. They need to be extended by individual database back-ends (MySQL, Oracle, etc.) `dbManager` : Virtual class[^2] extended by actual database managers, e.g., Oracle, MySQL, Informix. `dbConnection` : Virtual class that captures a connection to a database instance[^3]. `dbResult` : Virtual class that describes the result of an SQL statement. `dbResultSet` : Virtual class, extends `dbResult` to fully describe the output of those statements that produce output records, i.e., `SELECT` (or `SELECT`-like) SQL statement. All these classes should implement the methods `show`, `describe`, and `getInfo`: `show` : (`print` in R) prints a one-line identification of the object. `describe` : prints a short summary of the meta-data of the specified object (like `summary` in R/S). `getInfo` : takes an object of one of the above classes and a string specifying a meta-data item, and it returns the corresponding information (`NULL` if unavailable). > mgr <- dbManager("MySQL") > getInfo(mgr, "version") > con <- dbConnect(mgr, ...) > getInfo(con, "type") The reason we implement the meta-data through `getInfo` in this way is to simplify the writing of database back-ends. We don’t want to overwhelm the developers of drivers (ourselves, most likely) with hundreds of methods as in the case of JDBC. In addition, the following methods should also be implemented: `getDatabases` : lists all available databases known to the `dbManager`. `getTables` : lists tables in a database. `getTableFields` : lists the fields in a table in a database. `getTableIndices` : lists the indices defined for a table in a database. These methods may be implemented using the appropriate `getInfo` method above. In the next few sections we describe in detail each of these classes and their methods. ### Class `dbManager` {#sec:dbManager} This class identifies the relational database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The `dbManager` class defines the following methods: `load` : initializes the driver code. We suggest having the generator, `dbManager(driver)`, automatically load the driver. `unload` : releases whatever resources the driver is using. `getVersion` : returns the version of the RS-DBI currently implemented, plus any other relevant information about the implementation itself and the RDBMS being used. ### Class `dbConnection` {#sec:dbConnection} This virtual class captures a connection to a RDBMS, and it provides access to dynamic SQL, result sets, RDBMS session management (transactions), etc. Note that the `dbManager` may or may not allow multiple simultaneous connections. The methods it defines include: `dbConnect` : opens a connection to the database `dbname`. Other likely arguments include `host`, `user`, and `password`. It returns an object that extends `dbConnection` in a driver-specific manner (e.g., the MySQL implementation creates a connection of class `MySQLConnection` that extends `dbConnection`). Note that we could separate the steps of connecting to a RDBMS and opening a database there (i.e., opening an *instance*). For simplicity we do the 2 steps in this method. If the user needs to open another instance in the same RDBMS, just open a new connection. `close` : closes the connection and discards all pending work. `dbExecStatement` : submits one SQL statement. It returns a `dbResult` object, and in the case of a `SELECT` statement, the object also inherits from `dbResultSet`. This `dbResultSet` object is needed for fetching the output rows of `SELECT` statements. The result of a non-`SELECT` statement (e.g., `UPDATE, DELETE, CREATE, ALTER`, ...) is defined as the number of rows affected (this seems to be common among RDBMS). `commit` : commits pending transaction (optional). `rollback` : undoes current transaction (optional). `callProc` : invokes a stored procedure in the RDBMS (tentative). Stored procedures are *not* part of the ANSI SQL-92 standard and possibly vary substantially from one RDBMS to another. For instance, Oracle seems to have a fairly decent implementation of stored procedures, but MySQL currently does not support them. `dbExec` : submit an SQL “scriptâ€� (multiple statements). May be implemented by looping with `dbExecStatement`. `dbNextResultSet` : When running SQL scripts (multiple statements), it closes the current result set in the `dbConnection`, executes the next statement and returns its result set. ### Class `dbResult` {#sec:dbResult} This virtual class describes the result of an SQL statement (any statement) and the state of the operation. Non-query statements (e.g., `CREATE`, `UPDATE`, `DELETE`) set the “completedâ€� state to 1, while `SELECT` statements to 0. Error conditions set this slot to a negative number. The `dbResult` class defines the following methods: `getStatement` : returns the SQL statement associated with the result set. `getDBConnection` : returns the `dbConnection` associated with the result set. `getRowsAffected` : returns the number of rows affected by the operation. `hasCompleted` : was the operation completed? `SELECT`’s, for instance, are not completed until their output rows are all fetched. `getException` : returns the status of the last SQL statement on a given connection as a list with two members, status code and status description. ### Class `dbResultSet` {#sec:dbResultSet} This virtual class extends `dbResult`, and it describes additional information from the result of a `SELECT` statement and the state of the operation. The `completed` state is set to 0 so long as there are pending rows to fetch. The `dbResultSet` class defines the following additional methods: `getRowCount` : returns the number of rows fetched so far. `getNullOk` : returns a logical vector with as many elements as there are fields in the result set, each element describing whether the corresponding field accepts `NULL` values. `getFields` : describes the `SELECT`ed fields. The description includes field names, RDBMS internal data types, internal length, internal precision and scale, null flag (i.e., column allows `NULL`’s), and corresponding S classes (which can be over-ridden with user-provided classes). The current MySQL and Oracle implementations define a `dbResultSet` as a named list with the following elements: `connection`: : the connection object associated with this result set; `statement`: : a string with the SQL statement being processed; `description`: : a field description `data.frame` with as many rows as there are fields in the `SELECT` output, and columns specifying the `name`, `type`, `length`, `precision`, `scale`, `Sclass` of the corresponding output field. `rowsAffected`: : the number of rows that were affected; `rowCount`: : the number of rows so far fetched; `completed`: : a logical value describing whether the operation has completed or not. `nullOk`: : a logical vector specifying whether the corresponding column may take NULL values. The methods above are implemented as accessor functions to this list in the obvious way. `setDataMappings` : defines a conversion between internal RDBMS data types and R/S classes. We expect the default mappings to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. (See Section [sec:mappings] for details.) `close` : closes the result set and frees resources both in R/S and the RDBMS. `fetch` : extracts the next `max.rec` records (-1 means all). ## Data Type Mappings {#sec:mappings} The data types supported by databases are slightly different than the data types in R and S, but the mapping between them is straightforward: Any of the many fixed and varying length character types are mapped to R/S `character`. Fixed-precision (non-IEEE) numbers are mapped into either doubles (`numeric`) or long (`integer`). Dates are mapped to character using the appropriate `TO_CHAR` function in the RDBMS (which should take care of any locale information). Some RDBMS support the type `CURRENCY` or `MONEY` which should be mapped to `numeric`. Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion as follows: 1. run the query (either with `dbExec` or `dbExecStatement`): > rs <- dbExecStatement(con, "select whatever-You-need") 2. extract the output field definitions > flds <- getFields(rs) 3. replace the class generator in the, say 3rd field, by the user own generator: > flds[3, "Sclass"] # default mapping [1] "character" by > flds[3, "Sclass"] <- "myOwnGeneratorFunction" 4. set the new data mapping prior to fetching > setDataMappings(resutlSet, flds) 5. fetch the rows and store in a `data.frame` > data <- fetch(resultSet) ## Open Issues {#sec:open-issues} We may need to provide some additional utilities, for instance to convert dates, to escape characters such as quotes and slashes in query strings, to strip excessive blanks from some character fields, etc. We need to decide whether we provide hooks so these conversions are done at the C level, or do all the post-processing in R or S. Another issue is what kind of data object is the output of an SQL query. Currently the MySQL and Oracle implementations return data as a `data.frame`; data frames have the slight inconvenience that they automatically re-label the fields according to R/S syntax, changing the actual RDBMS labels of the variables; the issue of non-numeric data being coerced into factors automatically “at the drop of a hatâ€� (as someone in s-news wrote) is also annoying. The execution of SQL scripts is not fully described. The method that executes scripts could run individual statements without returning until it encounters a query (`SELECT`-like) statement. At that point it could return that one result set. The application is then responsible for fetching these rows, and then for invoking `dbNextResultSet` on the opened `dbConnection` object to repeat the `dbExec`/`fetch` loop until it encounters the next `dbResultSet`. And so on. Another (potentially very expensive) alternative would be to run all statements sequentially and return a list of `data.frame`s, each element of the list storing the result of each statement. Binary objects and large objects present some challenges both to R and S. It is becoming more common to store images, sounds, and other data types as binary objects in RDBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects – perhaps tentatively not in full generality. Large objects could be fetched by repeatedly invoking a specified R/S function that takes as argument chunks of a specified number of raw bytes. In the case of S4 (and Splus5.x) the RS-DBI implementation can write into an opened connection for which the user has defined a reader (but can we guarantee that we won’t overflow the connection?). In the case of R it is not clear what data type binary large objects (BLOB) should be mapped into. ## Limitations {#sec:limitations} These are some of the limitations of the current interface definition: - we only allow one SQL statement at a time, forcing users to split SQL scripts into individual statements; - transaction management is not fully described; - the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variablesâ€�; this is a mechanism by which the contents of S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement /* SQL */ SELECT * from emp_table where emp_id = :sampleEmployee would take the vector `sampleEmployee` and iterate over each of its elements to get the result. Perhaps RS-DBI could at some point in the future implement this feature. # Other Approaches The high-level, front-end description of RS-DBI is the more critical aspect of the interface. Details on how to actually implement this interface may change over time. The approach described in this document based on one back-end driver per RDBMS is reasonable, but not the only approach – we simply felt that a simpler approach based on well-understood and self-contained tools (R, S, and C API’s) would be a better start. Nevertheless we want to briefly mention a few alternatives that we considered and tentatively decided against, but may quite possibly re-visit in the near future. ## Open Database Connectivity (ODBC) {#sec:odbc} The ODBC protocol was developed by Microsoft to allow connectivity among C/C++ applications and RDBMS. As you would expect, originally implementations of the ODBC were only available under Windows environments. There are various effort to create a Unix implementation (see [the Unix ODBC](https://www.unixodbc.org/) web-site and @odbc.lj). This approach looks promising because it allows us to write only one back-end, instead of one per RDBMS. Since most RDBMS already provide ODBC drivers, this could greatly simplify development. Unfortunately, the Unix implementation of ODBC was not mature enough at the time we looked at it, a situation we expect will change in the next year or so. At that point we will need to re-evaluate it to make sure that such an ODBC interface does not penalize the interface in terms of performance, ease of use, portability among the various Unix versions, etc. ## Java Database Connectivity (JDBC) {#sec:jdbc} Another protocol, the Java database connectivity, is very well-done and supported by just about every RDBMS. The issue with JDBC is that as of today neither S nor R (which are written in C) interfaces cleanly with Java. There are several efforts (some in a quite fairly advanced state) to allow S and R to invoke Java methods. Once this interface is widely available in Splus5x and R we will need to re-visit this issue again and study the performance, usability, etc., of JDBC as a common back-end to the RS-DBI. ## CORBA and a 3-tier Architecture {#sec:corba} Yet another approach is to move the interface to RDBMS out of R and S altogether into a separate system or server that would serve as a proxy between R/S and databases. The communication to this middle-layer proxy could be done through CORBA [@s-corba.98, @corba:siegel.96], Java’s RMI, or some other similar technology. Such a design could be very flexible, but the CORBA facilities both in R and S are not widely available yet, and we do not know whether this will be made available to Splus5 users from MathSoft. Also, my experience with this technology is rather limited. On the other hand, this 3-tier architecture seem to offer the most flexibility to cope with very large distributed databases, not necessarily relational. # Resources {#sec:resources} The latest documentation and software on the RS-DBI was available at www.omegahat.net (link dead now: `https://www.omegahat.net/contrib/RS-DBI/index.html`). The R community has developed interfaces to some databases: [RmSQL](https://cran.r-project.org/src/contrib/Archive/RmSQL/) is an interface to the [mSQL](https://www.hughes.com.au/) database written by Torsten Hothorn; [RPgSQL](https://keittlab.org) is an interface to [PostgreSQL](https://www.postgreSQL.org) and was written by Timothy H. Keitt; [RODBC](https://www.stats.ox.ac.uk/pub/bdr/) is an interface to ODBC, and it was written by [Michael Lapsley](mailto:mlapsley@sthelier.sghms.ac.uk). (For more details on all these see @R.imp-exp.) The are R and S-Plus interfaces to [MySQL](https://dev.mysql.com/) that follow the propose RS-DBI API described here; also, there’s an S-Plus interface SOracle @RS-Oracle to Oracle (we expect to have an R implementation soon.) The idea of a common interface to databases has been successfully implemented in Java’s Database Connectivity (JDBC) ([www.javasoft.com](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/)), in C through the Open Database Connectivity (ODBC) ([www.unixodbc.org](https://www.unixodbc.org/)), in Python’s Database Application Programming Interface ([www.python.org](https://www.python.org)), and in Perl’s Database Interface ([www.cpan.org](https://www.cpan.org)). # Acknowledgements The R/S database interface came about from suggestions, comments, and discussions with [John M. Chambers](mailto:jmc@research.bell-labs.com) and [Duncan Temple Lang](mailto:duncan@research.bell-labs.com) in the context of the Omega Project for Statistical Computing. [Doug Bates](mailto:bates@stat.wisc.edu) and [Saikat DebRoy](mailto:saikat@stat.wisc.edu) ported (and greatly improved) the first MySQL implementation to R. # The S Version 4 Definitions The following code is meant to serve as a detailed description of the R/S to database interface. We decided to use S4 (instead of R or S version 3) because its clean syntax help us to describe easily the classes and methods that form the RS-DBI, and also to convey the inter-class relationships. ```R ## Define all the classes and methods to be used by an ## implementation of the RS-DataBase Interface. Mostly, ## these classes are virtual and each driver should extend ## them to provide the actual implementation. ## Class: dbManager ## This class identifies the DataBase Management System ## (Oracle, MySQL, Informix, PostgreSQL, etc.) setClass("dbManager", VIRTUAL) setGeneric("load", def = function(dbMgr,...) standardGeneric("load") ) setGeneric("unload", def = function(dbMgr,...) standardGeneric("unload") ) setGeneric("getVersion", def = function(dbMgr,...) standardGeneric("getVersion") ) ## Class: dbConnections ## This class captures a connection to a database instance. setClass("dbConnection", VIRTUAL) setGeneric("dbConnection", def = function(dbMgr, ...) standardGeneric("dbConnection") ) setGeneric("dbConnect", def = function(dbMgr, ...) standardGeneric("dbConnect") ) setGeneric("dbExecStatement", def = function(con, statement, ...) standardGeneric("dbExecStatement") ) setGeneric("dbExec", def = function(con, statement, ...) standardGeneric("dbExec") ) setGeneric("getResultSet", def = function(con, ..) standardGeneric("getResultSet") ) setGeneric("commit", def = function(con, ...) standardGeneric("commit") ) setGeneric("rollback", def = function(con, ...) standardGeneric("rollback") ) setGeneric("callProc", def = function(con, ...) standardGeneric("callProc") ) setMethod("close", signature = list(con="dbConnection", type="missing"), def = function(con, type) NULL ) ## Class: dbResult ## This is a base class for arbitrary results from the RDBMS ## (INSERT, UPDATE, DELETE). SELECTs (and SELECT-like) ## statements produce "dbResultSet" objects, which extend ## dbResult. setClass("dbResult", VIRTUAL) setMethod("close", signature = list(con="dbResult", type="missing"), def = function(con, type) NULL ) ## Class: dbResultSet ## Note that we define a resultSet as the result of a ## SELECT SQL statement. setClass("dbResultSet", "dbResult") setGeneric("fetch", def = function(resultSet,n,...) standardGeneric("fetch") ) setGeneric("hasCompleted", def = function(object, ...) standardGeneric("hasCompleted") ) setGeneric("getException", def = function(object, ...) standardGeneric("getException") ) setGeneric("getDBconnection", def = function(object, ...) standardGeneric("getDBconnection") ) setGeneric("setDataMappings", def = function(resultSet, ...) standardGeneric("setDataMappings") ) setGeneric("getFields", def = function(object, table, dbname, ...) standardGeneric("getFields") ) setGeneric("getStatement", def = function(object, ...) standardGeneric("getStatement") ) setGeneric("getRowsAffected", def = function(object, ...) standardGeneric("getRowsAffected") ) setGeneric("getRowCount", def = function(object, ...) standardGeneric("getRowCount") ) setGeneric("getNullOk", def = function(object, ...) standardGeneric("getNullOk") ) ## Meta-data: setGeneric("getInfo", def = function(object, ...) standardGeneric("getInfo") ) setGeneric("describe", def = function(object, verbose=F, ...) standardGeneric("describe") ) setGeneric("getCurrentDatabase", def = function(object, ...) standardGeneric("getCurrentDatabase") ) setGeneric("getDatabases", def = function(object, ...) standardGeneric("getDatabases") ) setGeneric("getTables", def = function(object, dbname, ...) standardGeneric("getTables") ) setGeneric("getTableFields", def = function(object, table, dbname, ...) standardGeneric("getTableFields") ) setGeneric("getTableIndices", def = function(object, table, dbname, ...) standardGeneric("getTableIndices") ) ``` [^2]: A virtual class allows us to group classes that share some common functionality, e.g., the virtual class “`dbConnection`â€� groups all the connection implementations by Informix, Ingres, DB/2, Oracle, etc. Although the details will vary from one RDBMS to another, the defining characteristic of these objects is what a virtual class captures. R and S version 3 do not explicitly define virtual classes, but they can easily implement the idea through inheritance. [^3]: The term “databaseâ€� is sometimes (confusingly) used both to denote the RDBMS, such as Oracle, MySQL, and also to denote a particular database instance under a RDBMS, such as “optoâ€� or “salesâ€� databases under the same RDBMS. DBI/vignettes/backend.Rmd0000644000176200001440000002413615005150137014716 0ustar liggesusers --- title: "Implementing a new backend" author: "Hadley Wickham, Kirill Müller" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Implementing a new backend} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r, echo = FALSE} library(DBI) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` The goal of this document is to help you implement a new backend for DBI. If you are writing a package that connects a database to R, I highly recommend that you make it DBI compatible because it makes your life easier by spelling out exactly what you need to do. The consistent interface provided by DBI makes it easier for you to implement the package (because you have fewer arbitrary choices to make), and easier for your users (because it follows a familiar pattern). In addition, the `DBItest` package provides test cases which you can easily incorporate in your package. I'll illustrate the process using a fictional database called Kazam. ## Getting started Start by creating a package. It's up to you what to call the package, but following the existing pattern of `RSQLite`, `RMySQL`, `RPostgres` and `ROracle` will make it easier for people to find it. For this example, I'll call my package `RKazam`. A ready-to-use template package is available at https://github.com/r-dbi/RKazam/. You can start by creating a new GitHub repository from this template, or by copying the package code. Rename "Kazam" to your desired name everywhere. The template package already contains dummy implementations for all classes and methods. If you chose to create the package manually, make sure to include in your `DESCRIPTION`: ```yaml Imports: DBI (>= 0.3.0), methods Suggests: DBItest, testthat ``` Importing `DBI` is fine, because your users are not supposed to *attach* your package anyway; the preferred method is to attach `DBI` and use explicit qualification via `::` to access the driver in your package (which needs to be done only once). ## Testing Why testing at this early stage? Because testing should be an integral part of the software development cycle. Test right from the start, add automated tests as you go, finish faster (because tests are automated) while maintaining superb code quality (because tests also check corner cases that you might not be aware of). Don't worry: if some test cases are difficult or impossible to satisfy, or take too long to run, you can just turn them off. Take the time now to head over to the `DBItest` vignette at `vignette("test", package = "DBItest")`. You will find a vast amount of ready-to-use test cases that will help you in the process of implementing your new DBI backend. Add custom tests that are not covered by `DBItest` at your discretion, or enhance `DBItest` and file a pull request if the test is generic enough to be useful for many DBI backends. ## Driver Start by making a driver class which inherits from `DBIDriver`. This class doesn't need to do anything, it's just used to dispatch other generics to the right method. Users don't need to know about this, so you can remove it from the default help listing with `@keywords internal`: ```{r} #' Driver for Kazam database. #' #' @keywords internal #' @export #' @import DBI #' @import methods setClass("KazamDriver", contains = "DBIDriver") ``` The driver class was more important in older versions of DBI, so you should also provide a dummy `dbUnloadDriver()` method. ```{r} #' @export #' @rdname Kazam-class setMethod("dbUnloadDriver", "KazamDriver", function(drv, ...) { TRUE }) ``` If your package needs global setup or tear down, do this in the `.onLoad()` and `.onUnload()` functions. You might also want to add a show method so the object prints nicely: ```{r} setMethod("show", "KazamDriver", function(object) { cat("\n") }) ``` Next create `Kazam()` which instantiates this class. ```{r} #' @export Kazam <- function() { new("KazamDriver") } Kazam() ``` ## Connection Next create a connection class that inherits from `DBIConnection`. This should store all the information needed to connect to the database. If you're talking to a C api, this will include a slot that holds an external pointer. ```{r} #' Kazam connection class. #' #' @export #' @keywords internal setClass("KazamConnection", contains = "DBIConnection", slots = list( host = "character", username = "character", # and so on ptr = "externalptr" ) ) ``` Now you have some of the boilerplate out of the way, you can start work on the connection. The most important method here is `dbConnect()` which allows you to connect to a specified instance of the database. Note the use of `@rdname Kazam`. This ensures that `Kazam()` and the connect method are documented together. ```{r} #' @param drv An object created by \code{Kazam()} #' @rdname Kazam #' @export #' @examples #' \dontrun{ #' db <- dbConnect(RKazam::Kazam()) #' dbWriteTable(db, "mtcars", mtcars) #' dbGetQuery(db, "SELECT * FROM mtcars WHERE cyl == 4") #' } setMethod("dbConnect", "KazamDriver", function(drv, ...) { # ... new("KazamConnection", host = host, ...) }) ``` * Replace `...` with the arguments needed to connect to your database. You'll always need to include `...` in the arguments, even if you don't use it, for compatibility with the generic. * This is likely to be where people first come for help, so the examples should show how to connect to the database, and how to query it. (Obviously these examples won't work yet.) Ideally, include examples that can be run right away (perhaps relying on a publicly hosted database), but failing that surround in `\dontrun{}` so people can at least see the code. Next, implement `show()` and `dbDisconnect()` methods. ## Results Finally, you're ready to implement the meat of the system: fetching results of a query into a data frame. First define a results class: ```{r} #' Kazam results class. #' #' @keywords internal #' @export setClass("KazamResult", contains = "DBIResult", slots = list(ptr = "externalptr") ) ``` Then write a `dbSendQuery()` method. This takes a connection and SQL string as arguments, and returns a result object. Again `...` is needed for compatibility with the generic, but you can add other arguments if you need them. ```{r} #' Send a query to Kazam. #' #' @export #' @examples #' # This is another good place to put examples setMethod("dbSendQuery", "KazamConnection", function(conn, statement, ...) { # some code new("KazamResult", ...) }) ``` Next, implement `dbClearResult()`, which should close the result set and free all resources associated with it: ```{r} #' @export setMethod("dbClearResult", "KazamResult", function(res, ...) { # free resources TRUE }) ``` The hardest part of every DBI package is writing the `dbFetch()` method. This needs to take a result set and (optionally) number of records to return, and create a dataframe. Mapping R's data types to those of your database may require a custom implementation of the `dbDataType()` method for your connection class: ```{r} #' Retrieve records from Kazam query #' @export setMethod("dbFetch", "KazamResult", function(res, n = -1, ...) { ... }) # (optionally) #' Find the database data type associated with an R object #' @export setMethod("dbDataType", "KazamConnection", function(dbObj, obj, ...) { ... }) ``` Next, implement `dbHasCompleted()` which should return a `logical` indicating if there are any rows remaining to be fetched. ```{r} #' @export setMethod("dbHasCompleted", "KazamResult", function(res, ...) {}) ``` With these four methods in place, you can now use the default `dbGetQuery()` to send a query to the database, retrieve results if available and then clean up. Spend some time now making sure this works with an existing database, or relax and let the `DBItest` package do the work for you. ## SQL methods You're now on the home stretch, and can make your wrapper substantially more useful by implementing methods that wrap around variations in SQL across databases: * `dbQuoteString()` and `dbQuoteIdentifer()` are used to safely quote strings and identifiers to avoid SQL injection attacks. Note that the former must be vectorized, but not the latter. * `dbWriteTable()` creates a database table given an R dataframe. I'd recommend using the functions prefixed with `sql` in this package to generate the SQL. These functions are still a work in progress so please let me know if you have problems. * `dbReadTable()`: a simple wrapper around `SELECT * FROM table`. Use `dbQuoteIdentifer()` to safely quote the table name and prevent mismatches between the names allowed by R and the database. * `dbListTables()` and `dbExistsTable()` let you determine what tables are available. If not provided by your database's API, you may need to generate sql that inspects the system tables. * `dbListFields()` shows which fields are available in a given table. * `dbRemoveTable()` wraps around `DROP TABLE`. Start with `SQL::sqlTableDrop()`. * `dbBegin()`, `dbCommit()` and `dbRollback()`: implement these three functions to provide basic transaction support. This functionality is currently not tested in the `DBItest` package. ## Metadata methods There are a lot of extra metadata methods for result sets (and one for the connection) that you might want to implement. They are described in the following. * `dbIsValid()` returns if a connection or a result set is open (`TRUE`) or closed (`FALSE`). All further methods in this section are valid for result sets only. * `dbGetStatement()` returns the issued query as a character value. * `dbColumnInfo()` lists the names and types of the result set's columns. * `dbGetRowCount()` and `dbGetRowsAffected()` returns the number of rows returned or altered in a `SELECT` or `INSERT`/`UPDATE` query, respectively. * `dbBind()` allows using parametrised queries. Take a look at `sqlInterpolate()` and `sqlParseVariables()` if your SQL engine doesn't offer native parametrised queries. ## Full DBI compliance By now, your package should implement all methods defined in the DBI specification. If you want to walk the extra mile, offer a read-only mode that allows your users to be sure that their valuable data doesn't get destroyed inadvertently. DBI/NAMESPACE0000644000176200001440000000632014602466070012075 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",SQL) S3method("[[",SQL) S3method(toString,Id) export(.SQL92Keywords) export(ANSI) export(Id) export(SQL) export(SQLKeywords) export(dbAppendTable) export(dbAppendTableArrow) export(dbBegin) export(dbBind) export(dbBindArrow) export(dbBreak) export(dbCallProc) export(dbCanConnect) export(dbClearResult) export(dbColumnInfo) export(dbCommit) export(dbConnect) export(dbCreateTable) export(dbCreateTableArrow) export(dbDataType) export(dbDisconnect) export(dbDriver) export(dbExecute) export(dbExistsTable) export(dbFetch) export(dbFetchArrow) export(dbFetchArrowChunk) export(dbGetConnectArgs) export(dbGetDBIVersion) export(dbGetException) export(dbGetInfo) export(dbGetQuery) export(dbGetQueryArrow) export(dbGetRowCount) export(dbGetRowsAffected) export(dbGetStatement) export(dbHasCompleted) export(dbIsReadOnly) export(dbIsValid) export(dbListConnections) export(dbListFields) export(dbListObjects) export(dbListResults) export(dbListTables) export(dbQuoteIdentifier) export(dbQuoteLiteral) export(dbQuoteString) export(dbReadTable) export(dbReadTableArrow) export(dbRemoveTable) export(dbRollback) export(dbSendQuery) export(dbSendQueryArrow) export(dbSendStatement) export(dbSetDataMappings) export(dbUnloadDriver) export(dbUnquoteIdentifier) export(dbWithTransaction) export(dbWriteTable) export(dbWriteTableArrow) export(fetch) export(isSQLKeyword) export(isSQLKeyword.default) export(make.db.names) export(make.db.names.default) export(sqlAppendTable) export(sqlAppendTableTemplate) export(sqlColumnToRownames) export(sqlCommentSpec) export(sqlCreateTable) export(sqlData) export(sqlInterpolate) export(sqlParseVariables) export(sqlParseVariablesImpl) export(sqlQuoteSpec) export(sqlRownamesToColumn) exportClasses(DBIConnection) exportClasses(DBIConnector) exportClasses(DBIDriver) exportClasses(DBIObject) exportClasses(DBIResult) exportClasses(DBIResultArrow) exportClasses(DBIResultArrowDefault) exportClasses(SQL) exportMethods(dbAppendTable) exportMethods(dbAppendTableArrow) exportMethods(dbBind) exportMethods(dbBindArrow) exportMethods(dbCanConnect) exportMethods(dbClearResult) exportMethods(dbConnect) exportMethods(dbCreateTable) exportMethods(dbCreateTableArrow) exportMethods(dbDataType) exportMethods(dbExecute) exportMethods(dbExistsTable) exportMethods(dbFetch) exportMethods(dbFetchArrow) exportMethods(dbFetchArrowChunk) exportMethods(dbGetConnectArgs) exportMethods(dbGetInfo) exportMethods(dbGetQuery) exportMethods(dbGetQueryArrow) exportMethods(dbGetRowCount) exportMethods(dbGetRowsAffected) exportMethods(dbGetStatement) exportMethods(dbHasCompleted) exportMethods(dbIsValid) exportMethods(dbListFields) exportMethods(dbListObjects) exportMethods(dbQuoteIdentifier) exportMethods(dbQuoteLiteral) exportMethods(dbQuoteString) exportMethods(dbReadTable) exportMethods(dbReadTableArrow) exportMethods(dbRemoveTable) exportMethods(dbSendQueryArrow) exportMethods(dbSendStatement) exportMethods(dbUnquoteIdentifier) exportMethods(dbWithTransaction) exportMethods(dbWriteTable) exportMethods(dbWriteTableArrow) exportMethods(show) exportMethods(sqlAppendTable) exportMethods(sqlCreateTable) exportMethods(sqlData) exportMethods(sqlInterpolate) exportMethods(sqlParseVariables) import(methods) DBI/NEWS.md0000644000176200001440000005322415146014721011755 0ustar liggesusers # DBI 1.3.0 (2026-02-11) ## Features - Add support for OpenTelemetry via the otel and otelsdk packages (@shikokuchuo, #551). ## Bug fixes - `dbWithTransaction()` calls `dbRollback()` also on interrupt (@klin333, #528). - `dbQuoteLiteral()` uses the format `"%Y-%m-%d %H:%M:%S%z"` which is understood by more databases (#486). ## Documentation - Add "Supported By Posit" badge to website (@krlmlr). - Render specification with newest pandoc (#568). - Add new generics to specification. ## Performance - Avoid unnecessary computation in default `dbUnquoteIdentifier()` method (@MichaelChirico, #515). ## Breaking changes - Many generics in the package are now a `"nonstandardGeneric"` instead of a `"standardGeneric"`: The `def` argument to `methods::setClass()` changed from a direct call to `methods::standardGeneric()` to a function that wraps `methods::standardGeneric()`. This should not affect most users, but became apparent with the tests in the dittodb package failing and is listed here for completeness. See for detail. # DBI 1.2.3 (2024-06-02) ## Bug fixes - `dbQuoteLiteral()` uses the format `"%Y-%m-%d %H-%M-%S%z"` which is understood by more databases (#467, #474). ## Documentation - Use relational-data.org as a replacement for relational.fit.cvut.cz. - Set BS version explicitly for now (@maelle, #478). - Include `dbGetInfo()` in the spec (#477). - Fix typos (@salim-b, #469, @MichaelChirico, #482). # DBI 1.2.2 (2024-02-09) ## Bug fixes - `Id()` does not assign empty names to the components if all arguments are unnamed (#464). - Add spec to version control to avoid weird pandoc errors on CRAN (#465). # DBI 1.2.1 (2024-01-12) ## Bug fixes - Fix `dbWriteTableArrow()` according to spec (#457). - Fix type inference in default method for `dbCreateTableArrow()` (#450). ## Features - `dbAppendTableArrow()` returns number of rows (#454). - Add `temporary` argument to `dbCreateTableArrow()` (#453). - Avoid coercing `params` in default implementation for `dbSendQueryArrow()` (#447). - Use `nanoarrow::infer_nanoarrow_schema()` in the default method for `dbCreateTable()` (#445). ## Chore - Add badge to `DBIResultArrow` class (#452). - Change maintainer e-mail. ## Documentation - Finalize Arrow vignette (#451, #455). - Document new Arrow generics (#444, #449). - Use dbitemplate (@maelle, #442). # DBI 1.2.0 (2023-12-20) ## Breaking changes - `dbUnquoteIdentifier()` creates `Id()` objects without component names and allows non-`NA` character input (#421, #422). ## Features - New generics `dbSendQueryArrow()`, `dbFetchArrow()`, `dbGetQueryArrow()`, `dbReadTableArrow()`, `dbWriteTableArrow()` (@nbenn, #390), `dbCreateTableArrow()`, `dbAppendTableArrow()` (#396), `dbBindArrow()` (#415) and `dbFetchArrowChunk()` (#424), with default implementations via nanoarrow (#414). - `Id()` now accepts unnamed components (#417). If names are provided, the components are arranged in SQL order (@eauleaf, #427). - New `dbIsValid()` method for `"DBIResultArrowDefault"` objects implemented by DBI (#425). - Implement `dbiDataType()` for objects of class `"blob"`. ## Documentation - Update pkgdown template (@maelle, #428, #438, #437). - Clarify repeated parameter binding (#430). - Deal with sundown of `https://relational.fit.cvut.cz` (#423). - Correct vignette titles (#419). - Harmonize table documentation (#400). - Tweak typo, add families for data retrieval and command execution. ## Testing - Enable BLOB tests for arrow \>= 10.0.0 (#395). - Run DBItest for SQLite as part of the checks here (#431). - Fix checks without suggested packages (#420). - Fix Windows tests on GHA (#406). - `testthat::use_testthat(3)` (#416). # DBI 1.1.3 (2022-06-18) ## Features - `dbAppendTable()` accepts `Id` (#381, @renkun-ken). ## Documentation - `?dbSendQuery` and related methods gain a section "The data retrieval flow" (#386). - `?dbSendStatement` and related methods gain a section "The command execution flow" (#386). # DBI 1.1.2 (2021-12-19) ## Features - Use `dbQuoteLiteral()` in default method for `sqlData()` (#362, #371). - Update specification with changes from DBItest 1.7.2 (#367). ## Documentation - The pkgdown documentation for DBI generics (e.g. `?dbConnect`) contains clickable links to all known backends (except ROracle), and an explanatory sentence (#360). - `?Id` gains better examples (#295, #370). - Elaborate on status of `dbWriteTable()` in the documentation (#352, #372). - Make method definition more similar to S3. All `setMethod()` calls refer to top-level functions (#368). - `?dbReadTable` and other pages gain pointers to `Id()` and `SQL()` (#359). # DBI 1.1.1 (2021-01-04) ## Documentation - Expand "Get started" vignette to two tutorials, basic and advanced (#332, @jawond). ## Bug fixes - `dbAppendTable()` now allows columns named `sep` (#336). - `dbAppendTable()` shows a better error message if the input has zero columns (#313). - `sqlInterpolate()` now correctly interprets consecutive comments (#329, @rnorberg). - `dbQuoteLiteral()` works for difftime objects (#325). - `dbQuoteLiteral()` quotes dates as `YYYY-MM-DD` without time zone (#331). ## Internal - Switch to GitHub Actions (#326). - Update URL in `DESCRIPTION`. # DBI 1.1.0 (2019-12-15) ## New features - New `DBIConnector` class (#280). - Specify `immediate` argument to `dbSendQuery()`, `dbGetQuery()`, `dbSendStatement()` and `dbExecute()` (#268). - Use specification for `dbGetInfo()` (#271). - `dbUnquoteIdentifier()` now supports `Id()` objects with `catalog` members (#266, @raffscallion). It also handles unquoted identifiers of the form `table`, `schema.table` or `catalog.schema.table`, for compatibility with dbplyr. ## Documentation - New DBI intro article (#286, @cutterkom). - Add pkgdown reference index (#288). - DBI specification on https://dbi.r-dbi.org/dev/articles/spec now comes with a table of contents and code formatting. - Update examples to refer to `params` instead of `param` (#235). - Improved documentation for `sqlInterpolate()` (#100). Add usage of `SQL()` to `sqlInterpolate()` examples (#259, @renkun-ken). - Improve documentation for `Id`. ## Internal - Add tests for `dbUnquoteIdentifier()` (#279, @baileych). - `sqlInterpolate()` uses `dbQuoteLiteral()` instead of checking the type of the input. - Avoid partial argument match in `dbWriteTable()` (#246, @richfitz). # DBI 1.0.0 (2018-05-02) ## New generics - New `dbAppendTable()` that by default calls `sqlAppendTableTemplate()` and then `dbExecute()` with a `param` argument, without support for `row.names` argument (#74). - New `dbCreateTable()` that by default calls `sqlCreateTable()` and then `dbExecute()`, without support for `row.names` argument (#74). - New `dbCanConnect()` generic with default implementation (#87). - New `dbIsReadOnly()` generic with default implementation (#190, @anhqle). ## Changes - `sqlAppendTable()` now accepts lists for the `values` argument, to support lists of `SQL` objects in R 3.1. - Add default implementation for `dbListFields(DBIConnection, Id)`, this relies on `dbQuoteIdentifier(DBIConnection, Id)` (#75). ## Documentation updates - The DBI specification vignette is rendered correctly from the installed package (#234). - Update docs on how to cope with stored procedures (#242, @aryoda). - Add "Additional arguments" sections and more examples for `dbGetQuery()`, `dbSendQuery()`, `dbExecute()` and `dbSendStatement()`. - The `dbColumnInfo()` method is now fully specified (#75). - The `dbListFields()` method is now fully specified (#75). - The dynamic list of methods in help pages doesn't contain methods in DBI anymore. ## Bug fixes - Pass missing `value` argument to secondary `dbWriteTable()` call (#737, @jimhester). - The `Id` class now uses `` and not `` when printing. - The default `dbUnquoteIdentifier()` implementation now complies to the spec. # DBI 0.8 (2018-02-24) Breaking changes ---------------- - `SQL()` now strips the names from the output if the `names` argument is unset. - The `dbReadTable()`, `dbWriteTable()`, `dbExistsTable()`, `dbRemoveTable()`, and `dbListFields()` generics now specialize over the first two arguments to support implementations with the `Id` S4 class as type for the second argument. Some packages may need to update their documentation to satisfy R CMD check again. New generics ------------ - Schema support: Export `Id()`, new generics `dbListObjects()` and `dbUnquoteIdentifier()`, methods for `Id` that call `dbQuoteIdentifier()` and then forward (#220). - New `dbQuoteLiteral()` generic. The default implementation uses switchpatch to avoid dispatch ambiguities, and forwards to `dbQuoteString()` for character vectors. Backends may override methods that also dispatch on the second argument, but in this case also an override for the `"SQL"` class is necessary (#172). Default implementations ----------------------- - Default implementations of `dbQuoteIdentifier()` and `dbQuoteLiteral()` preserve names, default implementation of `dbQuoteString()` strips names (#173). - Specialized methods for `dbQuoteString()` and `dbQuoteIdentifier()` are available again, for compatibility with clients that use `getMethod()` to access them (#218). - Add default implementation of `dbListFields()`. - The default implementation of `dbReadTable()` now has `row.names = FALSE` as default and also supports `row.names = NULL` (#186). API changes ----------- - The `SQL()` function gains an optional `names` argument which can be used to assign names to SQL strings. Deprecated generics ------------------- - `dbListConnections()` is soft-deprecated by documentation. - `dbListResults()` is deprecated by documentation (#58). - `dbGetException()` is soft-deprecated by documentation (#51). - The deprecated `print.list.pairs()` has been removed. Bug fixes --------- - Fix `dbDataType()` for `AsIs` object (#198, @yutannihilation). - Fix `dbQuoteString()` and `dbQuoteIdentifier()` to ignore invalid UTF-8 strings (r-dbi/DBItest#156). Documentation ------------- - Help pages for generics now contain a dynamic list of methods implemented by DBI backends (#162). - `sqlInterpolate()` now supports both named and positional variables (#216, @hannesmuehleisen). - Point to db.rstudio.com (@wibeasley, #209). - Reflect new 'r-dbi' organization in `DESCRIPTION` (@wibeasley, #207). Internal -------- - Using switchpatch on the second argument for default implementations of `dbQuoteString()` and `dbQuoteIdentifier()`. # DBI 0.7 (2017-06-17) - Import updated specs from `DBItest`. - The default implementation of `dbGetQuery()` now accepts an `n` argument and forwards it to `dbFetch()`. No warning about pending rows is issued anymore (#76). - Require R >= 3.0.0 (for `slots` argument of `setClass()`) (#169, @mvkorpel). # DBI 0.6-1 (2017-04-01) - Fix `dbReadTable()` for backends that do not provide their own implementation (#171). # DBI 0.6 (2017-03-08) - Interface changes - Deprecated `dbDriver()` and `dbUnloadDriver()` by documentation (#21). - Renamed arguments to `sqlInterpolate()` and `sqlParseVariables()` to be more consistent with the rest of the interface, and added `.dots` argument to `sqlParseVariables`. DBI drivers are now expected to implement `sqlParseVariables(conn, sql, ..., .dots)` and `sqlInterpolate(conn, sql, ...)` (#147). - Interface enhancements - Removed `valueClass = "logical"` for those generics where the return value is meaningless, to allow backends to return invisibly (#135). - Avoiding using braces in the definitions of generics if possible, so that standard generics can be detected (#146). - Added default implementation for `dbReadTable()`. - All standard generics are required to have an ellipsis (with test), for future extensibility. - Improved default implementation of `dbQuoteString()` and `dbQuoteIdentifier()` (#77). - Removed `tryCatch()` call in `dbGetQuery()` (#113). - Documentation improvements - Finalized first draft of DBI specification, now in a vignette. - Most methods now draw documentation from `DBItest`, only those where the behavior is not finally decided don't do this yet yet. - Removed `max.connections` requirement from documentation (#56). - Improved `dbBind()` documentation and example (#136). - Change `omegahat.org` URL to `omegahat.net`, the particular document still doesn't exist below the new domain. - Internal - Use roxygen2 inheritance to copy DBI specification to this package. - Use `tic` package for building documentation. - Use markdown in documentation. # DBI 0.5-1 (2016-09-09) - Documentation and example updates. # DBI 0.5 (2016-08-11, CRAN release) - Interface changes - `dbDataType()` maps `character` values to `"TEXT"` by default (#102). - The default implementation of `dbQuoteString()` doesn't call `encodeString()` anymore: Neither SQLite nor Postgres understand e.g. `\n` in a string literal, and all of SQLite, Postgres, and MySQL accept an embedded newline (#121). - Interface enhancements - New `dbSendStatement()` generic, forwards to `dbSendQuery()` by default (#20, #132). - New `dbExecute()`, calls `dbSendStatement()` by default (#109, @bborgesr). - New `dbWithTransaction()` that calls `dbBegin()` and `dbCommit()`, and `dbRollback()` on failure (#110, @bborgesr). - New `dbBreak()` function which allows aborting from within `dbWithTransaction()` (#115, #133). - Export `dbFetch()` and `dbQuoteString()` methods. - Documentation improvements: - One example per function (except functions scheduled for deprecation) (#67). - Consistent layout and identifier naming. - Better documentation of generics by adding links to the class and related generics in the "See also" section under "Other DBI... generics" (#130). S4 documentation is directed to a hidden page to unclutter documentation index (#59). - Fix two minor vignette typos (#124, @mdsumner). - Add package documentation. - Remove misleading parts in `dbConnect()` documentation (#118). - Remove misleading link in `dbDataType()` documentation. - Remove full stop from documentation titles. - New help topic "DBIspec" that contains the full DBI specification (currently work in progress) (#129). - HTML documentation generated by `staticdocs` is now uploaded to https://rstats-db.github.io/DBI for each build of the "production" branch (#131). - Further minor changes and fixes. - Internal - Use `contains` argument instead of `representation()` to denote base classes (#93). - Remove redundant declaration of transaction methods (#110, @bborgesr). # DBI 0.4-1 (2016-05-07, CRAN release) - The default `show()` implementations silently ignore all errors. Some DBI drivers (e.g., RPostgreSQL) might fail to implement `dbIsValid()` or the other methods used. # DBI 0.4 (2016-04-30) * New package maintainer: Kirill Müller. * `dbGetInfo()` gains a default method that extracts the information from `dbGetStatement()`, `dbGetRowsAffected()`, `dbHasCompleted()`, and `dbGetRowCount()`. This means that most drivers should no longer need to implement `dbGetInfo()` (which may be deprecated anyway at some point) (#55). * `dbDataType()` and `dbQuoteString()` are now properly exported. * The default implementation for `dbDataType()` (powered by `dbiDataType()`) now also supports `difftime` and `AsIs` objects and lists of `raw` (#70). * Default `dbGetQuery()` method now always calls `dbFetch()`, in a `tryCatch()` block. * New generic `dbBind()` for binding values to a parameterised query. * DBI gains a number of SQL generation functions. These make it easier to write backends by implementing common operations that are slightly tricky to do absolutely correctly. * `sqlCreateTable()` and `sqlAppendTable()` create tables from a data frame and insert rows into an existing table. These will power most implementations of `dbWriteTable()`. `sqlAppendTable()` is useful for databases that support parameterised queries. * `sqlRownamesToColumn()` and `sqlColumnToRownames()` provide a standard way of translating row names to and from the database. * `sqlInterpolate()` and `sqlParseVariables()` allows databases without native parameterised queries to use parameterised queries to avoid SQL injection attacks. * `sqlData()` is a new generic that converts a data frame into a data frame suitable for sending to the database. This is used to (e.g.) ensure all character vectors are encoded as UTF-8, or to convert R varible types (like factor) to types supported by the database. * The `sqlParseVariablesImpl()` is now implemented purely in R, with full test coverage (#83, @hannesmuehleisen). * `dbiCheckCompliance()` has been removed, the functionality is now available in the `DBItest` package (#80). * Added default `show()` methods for driver, connection and results. * New concrete `ANSIConnection` class and `ANSI()` function to generate a dummy ANSI compliant connection useful for testing. * Default `dbQuoteString()` and `dbQuoteIdentifer()` methods now use `encodeString()` so that special characters like `\n` are correctly escaped. `dbQuoteString()` converts `NA` to (unquoted) NULL. * The initial DBI proposal and DBI version 1 specification are now included as a vignette. These are there mostly for historical interest. * The new `DBItest` package is described in the vignette. * Deprecated `print.list.pairs()`. * Removed unused `dbi_dep()`. # Version 0.3.1 * Actually export `dbIsValid()` :/ * `dbGetQuery()` uses `dbFetch()` in the default implementation. # Version 0.3.0 ## New and enhanced generics * `dbIsValid()` returns a logical value describing whether a connection or result set (or other object) is still valid. (#12). * `dbQuoteString()` and `dbQuoteIdentifier()` to implement database specific quoting mechanisms. * `dbFetch()` added as alias to `fetch()` to provide consistent name. Implementers should define methods for both `fetch()` and `dbFetch()` until `fetch()` is deprecated in 2015. For now, the default method for `dbFetch()` calls `fetch()`. * `dbBegin()` begins a transaction (#17). If not supported, DB specific methods should throw an error (as should `dbCommit()` and `dbRollback()`). ## New default methods * `dbGetStatement()`, `dbGetRowsAffected()`, `dbHasCompleted()`, and `dbGetRowCount()` gain default methods that extract the appropriate elements from `dbGetInfo()`. This means that most drivers should no longer need to implement these methods (#13). * `dbGetQuery()` gains a default method for `DBIConnection` which uses `dbSendQuery()`, `fetch()` and `dbClearResult()`. ## Deprecated features * The following functions are soft-deprecated. They are going away, and developers who use the DBI should begin preparing. The formal deprecation process will begin in July 2015, where these function will emit warnings on use. * `fetch()` is replaced by `dbFetch()`. * `make.db.names()`, `isSQLKeyword()` and `SQLKeywords()`: a black list based approach is fundamentally flawed; instead quote strings and identifiers with `dbQuoteIdentifier()` and `dbQuoteString()`. * `dbGetDBIVersion()` is deprecated since it's now just a thin wrapper around `packageVersion("DBI")`. * `dbSetDataMappings()` (#9) and `dbCallProc()` (#7) are deprecated as no implementations were ever provided. ## Other improvements * `dbiCheckCompliance()` makes it easier for implementors to check that their package is in compliance with the DBI specification. * All examples now use the RSQLite package so that you can easily try out the code samples (#4). * `dbDriver()` gains a more effective search mechanism that doesn't rely on packages being loaded (#1). * DBI has been converted to use roxygen2 for documentation, and now most functions have their own documentation files. I would love your feedback on how we could make the documentation better! # Version 0.2-7 * Trivial changes (updated package fields, daj) # Version 0.2-6 * Removed deprecated \synopsis in some Rd files (thanks to Prof. Ripley) # Version 0.2-5 * Code cleanups contributed by Matthias Burger: avoid partial argument name matching and use TRUE/FALSE, not T/F. * Change behavior of make.db.names.default to quote SQL keywords if allow.keywords is FALSE. Previously, SQL keywords would be name mangled with underscores and a digit. Now they are quoted using '"'. # Version 0.2-4 * Changed license from GPL to LPGL * Fixed a trivial typo in documentation # Version 0.1-10 * Fixed documentation typos. # Version 0.1-9 * Trivial changes. # Version 0.1-8 * A trivial change due to package.description() being deprecated in 1.9.0. # Version 0.1-7 * Had to do a substantial re-formatting of the documentation due to incompatibilities introduced in 1.8.0 S4 method documentation. The contents were not changed (modulo fixing a few typos). Thanks to Kurt Hornik and John Chambers for their help. # Version 0.1-6 * Trivial documentation changes (for R CMD check's sake) # Version 0.1-5 * Removed duplicated setGeneric("dbSetDataMappings") # Version 0.1-4 * Removed the "valueClass" from some generic functions, namely, dbListConnections, dbListResults, dbGetException, dbGetQuery, and dbGetInfo. The reason is that methods for these generics could potentially return different classes of objects (e.g., the call dbGetInfo(res) could return a list of name-value pairs, while dbGetInfo(res, "statement") could be a character vector). * Added 00Index to inst/doc * Added dbGetDBIVersion() (simple wrapper to package.description). # Version 0.1-3 * ??? Minor changes? # Version 0.1-2 * An implementation based on version 4 classes and methods. * Incorporated (mostly Tim Keitt's) comments. DBI/inst/0000755000176200001440000000000015147357131011634 5ustar liggesusersDBI/inst/doc/0000755000176200001440000000000015147357131012401 5ustar liggesusersDBI/inst/doc/backend.R0000644000176200001440000000550015147357127014120 0ustar liggesusers## ----echo = FALSE------------------------------------------------------------- library(DBI) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ## ----------------------------------------------------------------------------- #' Driver for Kazam database. #' #' @keywords internal #' @export #' @import DBI #' @import methods setClass("KazamDriver", contains = "DBIDriver") ## ----------------------------------------------------------------------------- #' @export #' @rdname Kazam-class setMethod("dbUnloadDriver", "KazamDriver", function(drv, ...) { TRUE }) ## ----------------------------------------------------------------------------- setMethod("show", "KazamDriver", function(object) { cat("\n") }) ## ----------------------------------------------------------------------------- #' @export Kazam <- function() { new("KazamDriver") } Kazam() ## ----------------------------------------------------------------------------- #' Kazam connection class. #' #' @export #' @keywords internal setClass("KazamConnection", contains = "DBIConnection", slots = list( host = "character", username = "character", # and so on ptr = "externalptr" ) ) ## ----------------------------------------------------------------------------- #' @param drv An object created by \code{Kazam()} #' @rdname Kazam #' @export #' @examples #' \dontrun{ #' db <- dbConnect(RKazam::Kazam()) #' dbWriteTable(db, "mtcars", mtcars) #' dbGetQuery(db, "SELECT * FROM mtcars WHERE cyl == 4") #' } setMethod("dbConnect", "KazamDriver", function(drv, ...) { # ... new("KazamConnection", host = host, ...) }) ## ----------------------------------------------------------------------------- #' Kazam results class. #' #' @keywords internal #' @export setClass("KazamResult", contains = "DBIResult", slots = list(ptr = "externalptr") ) ## ----------------------------------------------------------------------------- #' Send a query to Kazam. #' #' @export #' @examples #' # This is another good place to put examples setMethod("dbSendQuery", "KazamConnection", function(conn, statement, ...) { # some code new("KazamResult", ...) }) ## ----------------------------------------------------------------------------- #' @export setMethod("dbClearResult", "KazamResult", function(res, ...) { # free resources TRUE }) ## ----------------------------------------------------------------------------- #' Retrieve records from Kazam query #' @export setMethod("dbFetch", "KazamResult", function(res, n = -1, ...) { ... }) # (optionally) #' Find the database data type associated with an R object #' @export setMethod("dbDataType", "KazamConnection", function(dbObj, obj, ...) { ... }) ## ----------------------------------------------------------------------------- #' @export setMethod("dbHasCompleted", "KazamResult", function(res, ...) {}) DBI/inst/doc/backend.html0000644000176200001440000007305415147357127014674 0ustar liggesusers Implementing a new backend

Implementing a new backend

Hadley Wickham, Kirill Müller

The goal of this document is to help you implement a new backend for DBI.

If you are writing a package that connects a database to R, I highly recommend that you make it DBI compatible because it makes your life easier by spelling out exactly what you need to do. The consistent interface provided by DBI makes it easier for you to implement the package (because you have fewer arbitrary choices to make), and easier for your users (because it follows a familiar pattern). In addition, the DBItest package provides test cases which you can easily incorporate in your package.

I’ll illustrate the process using a fictional database called Kazam.

Getting started

Start by creating a package. It’s up to you what to call the package, but following the existing pattern of RSQLite, RMySQL, RPostgres and ROracle will make it easier for people to find it. For this example, I’ll call my package RKazam.

A ready-to-use template package is available at https://github.com/r-dbi/RKazam/. You can start by creating a new GitHub repository from this template, or by copying the package code. Rename “Kazam� to your desired name everywhere. The template package already contains dummy implementations for all classes and methods.

If you chose to create the package manually, make sure to include in your DESCRIPTION:

Imports:
  DBI (>= 0.3.0),
  methods
Suggests:
  DBItest, testthat

Importing DBI is fine, because your users are not supposed to attach your package anyway; the preferred method is to attach DBI and use explicit qualification via :: to access the driver in your package (which needs to be done only once).

Testing

Why testing at this early stage? Because testing should be an integral part of the software development cycle. Test right from the start, add automated tests as you go, finish faster (because tests are automated) while maintaining superb code quality (because tests also check corner cases that you might not be aware of). Don’t worry: if some test cases are difficult or impossible to satisfy, or take too long to run, you can just turn them off.

Take the time now to head over to the DBItest vignette at vignette("test", package = "DBItest"). You will find a vast amount of ready-to-use test cases that will help you in the process of implementing your new DBI backend.

Add custom tests that are not covered by DBItest at your discretion, or enhance DBItest and file a pull request if the test is generic enough to be useful for many DBI backends.

Driver

Start by making a driver class which inherits from DBIDriver. This class doesn’t need to do anything, it’s just used to dispatch other generics to the right method. Users don’t need to know about this, so you can remove it from the default help listing with @keywords internal:

#' Driver for Kazam database.
#'
#' @keywords internal
#' @export
#' @import DBI
#' @import methods
setClass("KazamDriver", contains = "DBIDriver")

The driver class was more important in older versions of DBI, so you should also provide a dummy dbUnloadDriver() method.

#' @export
#' @rdname Kazam-class
setMethod("dbUnloadDriver", "KazamDriver", function(drv, ...) {
  TRUE
})

If your package needs global setup or tear down, do this in the .onLoad() and .onUnload() functions.

You might also want to add a show method so the object prints nicely:

setMethod("show", "KazamDriver", function(object) {
  cat("<KazamDriver>\n")
})

Next create Kazam() which instantiates this class.

#' @export
Kazam <- function() {
  new("KazamDriver")
}

Kazam()
#> <KazamDriver>

Connection

Next create a connection class that inherits from DBIConnection. This should store all the information needed to connect to the database. If you’re talking to a C api, this will include a slot that holds an external pointer.

#' Kazam connection class.
#'
#' @export
#' @keywords internal
setClass("KazamConnection",
  contains = "DBIConnection",
  slots = list(
    host = "character",
    username = "character",
    # and so on
    ptr = "externalptr"
  )
)

Now you have some of the boilerplate out of the way, you can start work on the connection. The most important method here is dbConnect() which allows you to connect to a specified instance of the database. Note the use of @rdname Kazam. This ensures that Kazam() and the connect method are documented together.

#' @param drv An object created by \code{Kazam()}
#' @rdname Kazam
#' @export
#' @examples
#' \dontrun{
#' db <- dbConnect(RKazam::Kazam())
#' dbWriteTable(db, "mtcars", mtcars)
#' dbGetQuery(db, "SELECT * FROM mtcars WHERE cyl == 4")
#' }
setMethod("dbConnect", "KazamDriver", function(drv, ...) {
  # ...

  new("KazamConnection", host = host, ...)
})
  • Replace ... with the arguments needed to connect to your database. You’ll always need to include ... in the arguments, even if you don’t use it, for compatibility with the generic.

  • This is likely to be where people first come for help, so the examples should show how to connect to the database, and how to query it. (Obviously these examples won’t work yet.) Ideally, include examples that can be run right away (perhaps relying on a publicly hosted database), but failing that surround in \dontrun{} so people can at least see the code.

Next, implement show() and dbDisconnect() methods.

Results

Finally, you’re ready to implement the meat of the system: fetching results of a query into a data frame. First define a results class:

#' Kazam results class.
#'
#' @keywords internal
#' @export
setClass("KazamResult",
  contains = "DBIResult",
  slots = list(ptr = "externalptr")
)

Then write a dbSendQuery() method. This takes a connection and SQL string as arguments, and returns a result object. Again ... is needed for compatibility with the generic, but you can add other arguments if you need them.

#' Send a query to Kazam.
#'
#' @export
#' @examples
#' # This is another good place to put examples
setMethod("dbSendQuery", "KazamConnection", function(conn, statement, ...) {
  # some code
  new("KazamResult", ...)
})

Next, implement dbClearResult(), which should close the result set and free all resources associated with it:

#' @export
setMethod("dbClearResult", "KazamResult", function(res, ...) {
  # free resources
  TRUE
})

The hardest part of every DBI package is writing the dbFetch() method. This needs to take a result set and (optionally) number of records to return, and create a dataframe. Mapping R’s data types to those of your database may require a custom implementation of the dbDataType() method for your connection class:

#' Retrieve records from Kazam query
#' @export
setMethod("dbFetch", "KazamResult", function(res, n = -1, ...) {
  ...
})

# (optionally)

#' Find the database data type associated with an R object
#' @export
setMethod("dbDataType", "KazamConnection", function(dbObj, obj, ...) {
  ...
})

Next, implement dbHasCompleted() which should return a logical indicating if there are any rows remaining to be fetched.

#' @export
setMethod("dbHasCompleted", "KazamResult", function(res, ...) {})

With these four methods in place, you can now use the default dbGetQuery() to send a query to the database, retrieve results if available and then clean up. Spend some time now making sure this works with an existing database, or relax and let the DBItest package do the work for you.

SQL methods

You’re now on the home stretch, and can make your wrapper substantially more useful by implementing methods that wrap around variations in SQL across databases:

  • dbQuoteString() and dbQuoteIdentifer() are used to safely quote strings and identifiers to avoid SQL injection attacks. Note that the former must be vectorized, but not the latter.

  • dbWriteTable() creates a database table given an R dataframe. I’d recommend using the functions prefixed with sql in this package to generate the SQL. These functions are still a work in progress so please let me know if you have problems.

  • dbReadTable(): a simple wrapper around SELECT * FROM table. Use dbQuoteIdentifer() to safely quote the table name and prevent mismatches between the names allowed by R and the database.

  • dbListTables() and dbExistsTable() let you determine what tables are available. If not provided by your database’s API, you may need to generate sql that inspects the system tables.

  • dbListFields() shows which fields are available in a given table.

  • dbRemoveTable() wraps around DROP TABLE. Start with SQL::sqlTableDrop().

  • dbBegin(), dbCommit() and dbRollback(): implement these three functions to provide basic transaction support. This functionality is currently not tested in the DBItest package.

Metadata methods

There are a lot of extra metadata methods for result sets (and one for the connection) that you might want to implement. They are described in the following.

  • dbIsValid() returns if a connection or a result set is open (TRUE) or closed (FALSE). All further methods in this section are valid for result sets only.

  • dbGetStatement() returns the issued query as a character value.

  • dbColumnInfo() lists the names and types of the result set’s columns.

  • dbGetRowCount() and dbGetRowsAffected() returns the number of rows returned or altered in a SELECT or INSERT/UPDATE query, respectively.

  • dbBind() allows using parametrised queries. Take a look at sqlInterpolate() and sqlParseVariables() if your SQL engine doesn’t offer native parametrised queries.

Full DBI compliance

By now, your package should implement all methods defined in the DBI specification. If you want to walk the extra mile, offer a read-only mode that allows your users to be sure that their valuable data doesn’t get destroyed inadvertently.

DBI/inst/doc/DBI-arrow.Rmd0000644000176200001440000001517214602466070014577 0ustar liggesusers--- title: "Using DBI with Arrow" author: "Kirill Müller" date: "25/12/2023" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Using DBI with Arrow} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} library(knitr) opts_chunk$set(echo = TRUE) knitr::opts_chunk$set(error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5")) knit_print.data.frame <- function(x, ...) { print(head(x, 6)) if (nrow(x) > 6) { cat("Showing 6 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ``` ## Who this tutorial is for This tutorial is for you if you want to leverage [Apache Arrow](https://arrow.apache.org/) for accessing and manipulating data on databases. See `vignette("DBI", package = "DBI")` and `vignette("DBI-advanced", package = "DBI")` for tutorials on accessing data using R's data frames instead of Arrow's structures. ## Rationale Apache Arrow is > a cross-language development platform for in-memory analytics, suitable for large and huge data, with support for out-of-memory operation. Arrow is also a data exchange format, the data types covered by Arrow align well with the data types supported by SQL databases. DBI 1.2.0 introduced support for Arrow as a format for exchanging data between R and databases. The aim is to: - accelerate data retrieval and loading, by using fewer costly data conversions; - better support reading and summarizing data from a database that is larger than memory; - provide better type fidelity with workflows centered around Arrow. This allows existing code to be used with Arrow, and it allows new code to be written that is more efficient and more flexible than code that uses R's data frames. The interface is built around the {nanoarrow} R package, with `nanoarrow::as_nanoarrow_array` and `nanoarrow::as_nanoarrow_array_stream` as fundamental data structures. ## New classes and generics DBI 1.2.0 introduces new classes and generics for working with Arrow data: - `dbReadTableArrow()` - `dbWriteTableArrow()` - `dbCreateTableArrow()` - `dbAppendTableArrow()` - `dbGetQueryArrow()` - `dbSendQueryArrow()` - `dbBindArrow()` - `dbFetchArrow()` - `dbFetchArrowChunk()` - `DBIResultArrow-class` - `DBIResultArrowDefault-class` Compatibility is important for DBI, and implementing new generics and classes greatly reduces the risk of breaking existing code. The DBI package comes with a fully functional fallback implementation for all existing DBI backends. The fallback is not improving performance, but it allows existing code to be used with Arrow before switching to a backend with native Arrow support. Backends with native support, like the [adbi](https://adbi.r-dbi.org/) package, implement the new generics and classes for direct support and improved performance. In the remainder of this tutorial, we will demonstrate the new generics and classes using the RSQLite package. SQLite is an in-memory database, this code does not need a database server to be installed and running. ## Prepare We start by setting up a database connection and creating a table with some data, using the original `dbWriteTable()` method. ```{r} library(DBI) con <- dbConnect(RSQLite::SQLite()) data <- data.frame( a = 1:3, b = 4.5, c = "five" ) dbWriteTable(con, "tbl", data) ``` ## Read all rows from a table The `dbReadTableArrow()` method reads all rows from a table into an Arrow stream, similarly to `dbReadTable()`. Arrow objects implement the `as.data.frame()` method, so we can convert the stream to a data frame. ```{r} stream <- dbReadTableArrow(con, "tbl") stream as.data.frame(stream) ``` ## Run queries The `dbGetQueryArrow()` method runs a query and returns the result as an Arrow stream. This stream can be turned into an `arrow::RecordBatchReader` object and processed further, without bringing it into R. ```{r} stream <- dbGetQueryArrow(con, "SELECT COUNT(*) AS n FROM tbl WHERE a < 3") stream path <- tempfile(fileext = ".parquet") arrow::write_parquet(arrow::as_record_batch_reader(stream), path) arrow::read_parquet(path) ``` ## Prepared queries The `dbGetQueryArrow()` method supports prepared queries, using the `params` argument which accepts a data frame or a list. ```{r} params <- data.frame(a = 3L) stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) params <- data.frame(a = c(2L, 4L)) # Equivalent to dbBind() stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) ``` ## Manual flow For the manual flow, use `dbSendQueryArrow()` to send a query to the database, and `dbFetchArrow()` to fetch the result. This also allows using the new `dbBindArrow()` method to bind data in Arrow format to a prepared query. Result objects must be cleared with `dbClearResult()`. ```{r} rs <- dbSendQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a") in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 2L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 3L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1:4L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) dbClearResult(rs) ``` ## Writing data Streams returned by `dbGetQueryArrow()` and `dbReadTableArrow()` can be written to a table using `dbWriteTableArrow()`. ```{r} stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbWriteTableArrow(con, "tbl_new", stream) dbReadTable(con, "tbl_new") ``` ## Appending data For more control over the writing process, use `dbCreateTableArrow()` and `dbAppendTableArrow()`. ```{r} stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbCreateTableArrow(con, "tbl_split", stream) dbAppendTableArrow(con, "tbl_split", stream) stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a >= 3") dbAppendTableArrow(con, "tbl_split", stream) dbReadTable(con, "tbl_split") ``` ## Conclusion Do not forget to disconnect from the database when done. ```{r} dbDisconnect(con) ``` That concludes the major features of DBI's new Arrow interface. For more details on the library functions covered in this tutorial see the DBI specification at `vignette("spec", package = "DBI")`. See the [adbi](https://adbi.r-dbi.org/) package for a backend with native Arrow support, and [nanoarrow](https://github.com/apache/arrow-nanoarrow) and [arrow](https://arrow.apache.org/docs/r/) for packages to work with the Arrow format. DBI/inst/doc/DBI-proposal.html0000644000176200001440000016214615147357123015535 0ustar liggesusers A Common Interface to Relational Databases from R and S – A Proposal

A Common Interface to Relational Databases from R and S – A Proposal

David James

March 16, 2000

For too long S and similar data analysis environments have lacked good interfaces to relational database systems (RDBMS). For the last twenty years or so these RDBMS have evolved into highly optimized client-server systems for data storage and manipulation, and currently they serve as repositories for most of the business, industrial, and research “raw� data that analysts work with. Other analysis packages, such as SAS, have traditionally provided good data connectivity, but S and GNU R have relied on intermediate text files as means of importing data (but see R Data Import/Export (2001) and Using Relational Database Systems with R (2000).) Although this simple approach works well for relatively modest amounts of mostly static data, it does not scale up to larger amounts of data distributed over machines and locations, nor does it scale up to data that is highly dynamic – situations that are becoming increasingly common.

We want to propose a common interface between R/S and RDBMS that would allow users to access data stored on database servers in a uniform and predictable manner irrespective of the database engine. The interface defines a small set of classes and methods similar in spirit to Python’s DB-API, Java’s JDBC, Microsoft’s ODBC, Perl’s DBI, etc., but it conforms to the “whole-object� philosophy so natural in S and R.

Computing with Distributed Data

As data analysts, we are increasingly faced with the challenge of larger data sources distributed over machines and locations; most of these data sources reside in relational database management systems (RDBMS). These relational databases represent a mature client-server distributed technology that we as analysts could be exploiting more that we’ve done in the past. The relational technology provides a well-defined standard, the ANSI SQL-92 X/Open CAE Specification: SQL and RDA (1994), both for defining and manipulating data in a highly optimized fashion from virtually any application.

In contrast, S and Splus have provided somewhat limited tools for coping with the challenges of larger and distributed data sets (Splus does provide an import function to import from databases, but it is quite limited in terms of SQL facilities). The R community has been more resourceful and has developed a number of good libraries for connecting to mSQL, MySQL, PostgreSQL, and ODBC; each library, however, has defined its own interface to each database engine a bit differently. We think it would be to everybody’s advantage to coordinate the definition of a common interface, an effort not unlike those taken in the Python and Perl communities.

The goal of a common, seamless access to distributed data is a modest one in our evolution towards a fully distributed computing environment. We recognize the greater goal of distributed computing as the means to fully integrate diverse systems – not just databases – into a truly flexible analysis environment. Good connectivity to databases, however, is of immediate necessity both in practical terms and as a means to help us transition from monolithic, self-contained systems to those in which computations, not only the data, can be carried out in parallel over a wide number of computers and/or systems Temple Lang (2000). Issues of reliability, security, location transparency, persistence, etc., will be new to most of us and working with distributed data may provide a more gradual change to ease in the ultimate goal of full distributed computing.

A Common Interface

We believe that a common interface to databases can help users easily access data stored in RDBMS. A common interface would describe, in a uniform way, how to connect to RDBMS, extract meta-data (such as list of available databases, tables, etc.) as well as a uniform way to execute SQL statements and import their output into R and S. The current emphasis is on querying databases and not so much in a full low-level interface for database development as in JDBC or ODBC, but unlike these, we want to approach the interface from the “whole-object� perspective Chambers (1998) so natural to R/S and Python – for instance, by fetching all fields and records simultaneously into a single object.

The basic idea is to split the interface into a front-end consisting of a few classes and generic functions that users invoke and a back-end set of database-specific classes and methods that implement the actual communication. (This is a very well-known pattern in software engineering, and another good verbatim is the device-independent graphics in R/S where graphics functions produce similar output on a variety of different devices, such X displays, Postscript, etc.)

The following verbatim shows the front-end:

> mgr <- dbManager("Oracle")
> con <- dbConnect(mgr, user = "user", passwd = "passwd")
> rs <- dbExecStatement(con,
          "select fld1, fld2, fld3 from MY_TABLE")
> tbls <- fetch(rs, n = 100)
> hasCompleted(rs)
[1] T
> close(rs)
> rs <- dbExecStatement(con,
          "select id_name, q25, q50 from liv2")
> res <- fetch(rs)
> getRowCount(rs)
[1] 73
> close(con)

Such scripts should work with other RDBMS (say, MySQL) by replacing the first line with

> mgr <- dbManager("MySQL")

Interface Classes

The following are the main RS-DBI classes. They need to be extended by individual database back-ends (MySQL, Oracle, etc.)

dbManager

Virtual class1 extended by actual database managers, e.g., Oracle, MySQL, Informix.

dbConnection

Virtual class that captures a connection to a database instance2.

dbResult

Virtual class that describes the result of an SQL statement.

dbResultSet

Virtual class, extends dbResult to fully describe the output of those statements that produce output records, i.e., SELECT (or SELECT-like) SQL statement.

All these classes should implement the methods show, describe, and getInfo:

show

(print in R) prints a one-line identification of the object.

describe

prints a short summary of the meta-data of the specified object (like summary in R/S).

getInfo

takes an object of one of the above classes and a string specifying a meta-data item, and it returns the corresponding information (NULL if unavailable).

> mgr <- dbManager("MySQL")
> getInfo(mgr, "version")
> con <- dbConnect(mgr, ...)
> getInfo(con, "type")

The reason we implement the meta-data through getInfo in this way is to simplify the writing of database back-ends. We don’t want to overwhelm the developers of drivers (ourselves, most likely) with hundreds of methods as in the case of JDBC.

In addition, the following methods should also be implemented:

getDatabases

lists all available databases known to the dbManager.

getTables

lists tables in a database.

getTableFields

lists the fields in a table in a database.

getTableIndices

lists the indices defined for a table in a database.

These methods may be implemented using the appropriate getInfo method above.

In the next few sections we describe in detail each of these classes and their methods.

Class dbManager

This class identifies the relational database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The dbManager class defines the following methods:

load

initializes the driver code. We suggest having the generator, dbManager(driver), automatically load the driver.

unload

releases whatever resources the driver is using.

getVersion

returns the version of the RS-DBI currently implemented, plus any other relevant information about the implementation itself and the RDBMS being used.

Class dbConnection

This virtual class captures a connection to a RDBMS, and it provides access to dynamic SQL, result sets, RDBMS session management (transactions), etc. Note that the dbManager may or may not allow multiple simultaneous connections. The methods it defines include:

dbConnect

opens a connection to the database dbname. Other likely arguments include host, user, and password. It returns an object that extends dbConnection in a driver-specific manner (e.g., the MySQL implementation creates a connection of class MySQLConnection that extends dbConnection). Note that we could separate the steps of connecting to a RDBMS and opening a database there (i.e., opening an instance). For simplicity we do the 2 steps in this method. If the user needs to open another instance in the same RDBMS, just open a new connection.

close

closes the connection and discards all pending work.

dbExecStatement

submits one SQL statement. It returns a dbResult object, and in the case of a SELECT statement, the object also inherits from dbResultSet. This dbResultSet object is needed for fetching the output rows of SELECT statements. The result of a non-SELECT statement (e.g., UPDATE, DELETE, CREATE, ALTER, …) is defined as the number of rows affected (this seems to be common among RDBMS).

commit

commits pending transaction (optional).

rollback

undoes current transaction (optional).

callProc

invokes a stored procedure in the RDBMS (tentative). Stored procedures are not part of the ANSI SQL-92 standard and possibly vary substantially from one RDBMS to another. For instance, Oracle seems to have a fairly decent implementation of stored procedures, but MySQL currently does not support them.

dbExec

submit an SQL “script� (multiple statements). May be implemented by looping with dbExecStatement.

dbNextResultSet

When running SQL scripts (multiple statements), it closes the current result set in the dbConnection, executes the next statement and returns its result set.

Class dbResult

This virtual class describes the result of an SQL statement (any statement) and the state of the operation. Non-query statements (e.g., CREATE, UPDATE, DELETE) set the “completed� state to 1, while SELECT statements to 0. Error conditions set this slot to a negative number. The dbResult class defines the following methods:

getStatement

returns the SQL statement associated with the result set.

getDBConnection

returns the dbConnection associated with the result set.

getRowsAffected

returns the number of rows affected by the operation.

hasCompleted

was the operation completed? SELECT’s, for instance, are not completed until their output rows are all fetched.

getException

returns the status of the last SQL statement on a given connection as a list with two members, status code and status description.

Class dbResultSet

This virtual class extends dbResult, and it describes additional information from the result of a SELECT statement and the state of the operation. The completed state is set to 0 so long as there are pending rows to fetch. The dbResultSet class defines the following additional methods:

getRowCount

returns the number of rows fetched so far.

getNullOk

returns a logical vector with as many elements as there are fields in the result set, each element describing whether the corresponding field accepts NULL values.

getFields

describes the SELECTed fields. The description includes field names, RDBMS internal data types, internal length, internal precision and scale, null flag (i.e., column allows NULL’s), and corresponding S classes (which can be over-ridden with user-provided classes). The current MySQL and Oracle implementations define a dbResultSet as a named list with the following elements:

connection:

the connection object associated with this result set;

statement:

a string with the SQL statement being processed;

description:

a field description data.frame with as many rows as there are fields in the SELECT output, and columns specifying the name, type, length, precision, scale, Sclass of the corresponding output field.

rowsAffected:

the number of rows that were affected;

rowCount:

the number of rows so far fetched;

completed:

a logical value describing whether the operation has completed or not.

nullOk:

a logical vector specifying whether the corresponding column may take NULL values.

The methods above are implemented as accessor functions to this list in the obvious way.

setDataMappings

defines a conversion between internal RDBMS data types and R/S classes. We expect the default mappings to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. (See Section [sec:mappings] for details.)

close

closes the result set and frees resources both in R/S and the RDBMS.

fetch

extracts the next max.rec records (-1 means all).

Data Type Mappings

The data types supported by databases are slightly different than the data types in R and S, but the mapping between them is straightforward: Any of the many fixed and varying length character types are mapped to R/S character. Fixed-precision (non-IEEE) numbers are mapped into either doubles (numeric) or long (integer). Dates are mapped to character using the appropriate TO_CHAR function in the RDBMS (which should take care of any locale information). Some RDBMS support the type CURRENCY or MONEY which should be mapped to numeric. Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion as follows:

  1. run the query (either with dbExec or dbExecStatement):

    > rs <- dbExecStatement(con, "select whatever-You-need")
  2. extract the output field definitions

    > flds <- getFields(rs)
  3. replace the class generator in the, say 3rd field, by the user own generator:

    > flds[3, "Sclass"]            # default mapping
    [1] "character"

    by

    > flds[3, "Sclass"] <- "myOwnGeneratorFunction"
  4. set the new data mapping prior to fetching

    > setDataMappings(resutlSet, flds)
  5. fetch the rows and store in a data.frame

    > data <- fetch(resultSet)

Open Issues

We may need to provide some additional utilities, for instance to convert dates, to escape characters such as quotes and slashes in query strings, to strip excessive blanks from some character fields, etc. We need to decide whether we provide hooks so these conversions are done at the C level, or do all the post-processing in R or S.

Another issue is what kind of data object is the output of an SQL query. Currently the MySQL and Oracle implementations return data as a data.frame; data frames have the slight inconvenience that they automatically re-label the fields according to R/S syntax, changing the actual RDBMS labels of the variables; the issue of non-numeric data being coerced into factors automatically “at the drop of a hat� (as someone in s-news wrote) is also annoying.

The execution of SQL scripts is not fully described. The method that executes scripts could run individual statements without returning until it encounters a query (SELECT-like) statement. At that point it could return that one result set. The application is then responsible for fetching these rows, and then for invoking dbNextResultSet on the opened dbConnection object to repeat the dbExec/fetch loop until it encounters the next dbResultSet. And so on. Another (potentially very expensive) alternative would be to run all statements sequentially and return a list of data.frames, each element of the list storing the result of each statement.

Binary objects and large objects present some challenges both to R and S. It is becoming more common to store images, sounds, and other data types as binary objects in RDBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects – perhaps tentatively not in full generality. Large objects could be fetched by repeatedly invoking a specified R/S function that takes as argument chunks of a specified number of raw bytes. In the case of S4 (and Splus5.x) the RS-DBI implementation can write into an opened connection for which the user has defined a reader (but can we guarantee that we won’t overflow the connection?). In the case of R it is not clear what data type binary large objects (BLOB) should be mapped into.

Limitations

These are some of the limitations of the current interface definition:

  • we only allow one SQL statement at a time, forcing users to split SQL scripts into individual statements;

  • transaction management is not fully described;

  • the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variablesâ€�; this is a mechanism by which the contents of S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement

      /* SQL */
      SELECT * from emp_table where emp_id = :sampleEmployee

    would take the vector sampleEmployee and iterate over each of its elements to get the result. Perhaps RS-DBI could at some point in the future implement this feature.

Other Approaches

The high-level, front-end description of RS-DBI is the more critical aspect of the interface. Details on how to actually implement this interface may change over time. The approach described in this document based on one back-end driver per RDBMS is reasonable, but not the only approach – we simply felt that a simpler approach based on well-understood and self-contained tools (R, S, and C API’s) would be a better start. Nevertheless we want to briefly mention a few alternatives that we considered and tentatively decided against, but may quite possibly re-visit in the near future.

Open Database Connectivity (ODBC)

The ODBC protocol was developed by Microsoft to allow connectivity among C/C++ applications and RDBMS. As you would expect, originally implementations of the ODBC were only available under Windows environments. There are various effort to create a Unix implementation (see the Unix ODBC web-site and Harvey (1999)). This approach looks promising because it allows us to write only one back-end, instead of one per RDBMS. Since most RDBMS already provide ODBC drivers, this could greatly simplify development. Unfortunately, the Unix implementation of ODBC was not mature enough at the time we looked at it, a situation we expect will change in the next year or so. At that point we will need to re-evaluate it to make sure that such an ODBC interface does not penalize the interface in terms of performance, ease of use, portability among the various Unix versions, etc.

Java Database Connectivity (JDBC)

Another protocol, the Java database connectivity, is very well-done and supported by just about every RDBMS. The issue with JDBC is that as of today neither S nor R (which are written in C) interfaces cleanly with Java. There are several efforts (some in a quite fairly advanced state) to allow S and R to invoke Java methods. Once this interface is widely available in Splus5x and R we will need to re-visit this issue again and study the performance, usability, etc., of JDBC as a common back-end to the RS-DBI.

CORBA and a 3-tier Architecture

Yet another approach is to move the interface to RDBMS out of R and S altogether into a separate system or server that would serve as a proxy between R/S and databases. The communication to this middle-layer proxy could be done through CORBA Siegel (1996), Java’s RMI, or some other similar technology. Such a design could be very flexible, but the CORBA facilities both in R and S are not widely available yet, and we do not know whether this will be made available to Splus5 users from MathSoft. Also, my experience with this technology is rather limited.

On the other hand, this 3-tier architecture seem to offer the most flexibility to cope with very large distributed databases, not necessarily relational.

Resources

The latest documentation and software on the RS-DBI was available at www.omegahat.net (link dead now: https://www.omegahat.net/contrib/RS-DBI/index.html). The R community has developed interfaces to some databases: RmSQL is an interface to the mSQL database written by Torsten Hothorn; RPgSQL is an interface to PostgreSQL and was written by Timothy H. Keitt; RODBC is an interface to ODBC, and it was written by Michael Lapsley. (For more details on all these see R Data Import/Export (2001).)

The are R and S-Plus interfaces to MySQL that follow the propose RS-DBI API described here; also, there’s an S-Plus interface SOracle James (In preparation) to Oracle (we expect to have an R implementation soon.)

The idea of a common interface to databases has been successfully implemented in Java’s Database Connectivity (JDBC) (www.javasoft.com), in C through the Open Database Connectivity (ODBC) (www.unixodbc.org), in Python’s Database Application Programming Interface (www.python.org), and in Perl’s Database Interface (www.cpan.org).

Acknowledgements

The R/S database interface came about from suggestions, comments, and discussions with John M. Chambers and Duncan Temple Lang in the context of the Omega Project for Statistical Computing. Doug Bates and Saikat DebRoy ported (and greatly improved) the first MySQL implementation to R.

The S Version 4 Definitions

The following code is meant to serve as a detailed description of the R/S to database interface. We decided to use S4 (instead of R or S version 3) because its clean syntax help us to describe easily the classes and methods that form the RS-DBI, and also to convey the inter-class relationships.

## Define all the classes and methods to be used by an
## implementation of the RS-DataBase Interface.  Mostly,
## these classes are virtual and each driver should extend
## them to provide the actual implementation.

## Class: dbManager
## This class identifies the DataBase Management System
## (Oracle, MySQL, Informix, PostgreSQL, etc.)

setClass("dbManager", VIRTUAL)

setGeneric("load",
   def = function(dbMgr,...)
   standardGeneric("load")
   )
setGeneric("unload",
   def = function(dbMgr,...)
   standardGeneric("unload")
   )
setGeneric("getVersion",
   def = function(dbMgr,...)
   standardGeneric("getVersion")
   )

## Class: dbConnections
## This class captures a connection to a database instance.

setClass("dbConnection", VIRTUAL)

setGeneric("dbConnection",
   def = function(dbMgr, ...)
   standardGeneric("dbConnection")
   )
setGeneric("dbConnect",
   def = function(dbMgr, ...)
   standardGeneric("dbConnect")
   )
setGeneric("dbExecStatement",
   def = function(con, statement, ...)
   standardGeneric("dbExecStatement")
   )
setGeneric("dbExec",
   def = function(con, statement, ...)
   standardGeneric("dbExec")
   )
setGeneric("getResultSet",
   def = function(con, ..)
   standardGeneric("getResultSet")
   )
setGeneric("commit",
   def = function(con, ...)
   standardGeneric("commit")
   )
setGeneric("rollback",
   def = function(con, ...)
   standardGeneric("rollback")
   )
setGeneric("callProc",
   def = function(con, ...)
   standardGeneric("callProc")
   )
setMethod("close",
   signature = list(con="dbConnection", type="missing"),
   def = function(con, type) NULL
   )

## Class: dbResult
## This is a base class for arbitrary results from the RDBMS
## (INSERT, UPDATE, DELETE).  SELECTs (and SELECT-like)
## statements produce "dbResultSet" objects, which extend
## dbResult.

setClass("dbResult", VIRTUAL)

setMethod("close",
   signature = list(con="dbResult", type="missing"),
   def = function(con, type) NULL
   )

## Class: dbResultSet
## Note that we define a resultSet as the result of a
## SELECT  SQL statement.

setClass("dbResultSet", "dbResult")

setGeneric("fetch",
   def = function(resultSet,n,...)
   standardGeneric("fetch")
   )
setGeneric("hasCompleted",
   def = function(object, ...)
   standardGeneric("hasCompleted")
   )
setGeneric("getException",
   def = function(object, ...)
   standardGeneric("getException")
   )
setGeneric("getDBconnection",
   def = function(object, ...)
   standardGeneric("getDBconnection")
   )
setGeneric("setDataMappings",
   def = function(resultSet, ...)
   standardGeneric("setDataMappings")
   )
setGeneric("getFields",
   def = function(object, table, dbname,  ...)
   standardGeneric("getFields")
   )
setGeneric("getStatement",
   def = function(object, ...)
   standardGeneric("getStatement")
   )
setGeneric("getRowsAffected",
   def = function(object, ...)
   standardGeneric("getRowsAffected")
   )
setGeneric("getRowCount",
   def = function(object, ...)
   standardGeneric("getRowCount")
   )
setGeneric("getNullOk",
   def = function(object, ...)
   standardGeneric("getNullOk")
   )

## Meta-data:
setGeneric("getInfo",
   def = function(object, ...)
   standardGeneric("getInfo")
   )
setGeneric("describe",
   def = function(object, verbose=F, ...)
   standardGeneric("describe")
   )
setGeneric("getCurrentDatabase",
   def = function(object, ...)
   standardGeneric("getCurrentDatabase")
   )
setGeneric("getDatabases",
   def = function(object, ...)
   standardGeneric("getDatabases")
   )
setGeneric("getTables",
   def = function(object, dbname, ...)
   standardGeneric("getTables")
   )
setGeneric("getTableFields",
   def = function(object, table, dbname, ...)
   standardGeneric("getTableFields")
   )
setGeneric("getTableIndices",
   def = function(object, table, dbname, ...)
   standardGeneric("getTableIndices")
   )
Chambers, J. M. 1998. Programming with Data: A Guide to the s Language. Springer.
Chambers, John M., Mark H. Hansen, David A. James, and Duncan Temple Lang. 1998. “Distributed Computing with Data: A CORBA-Based Approach.� Computing Science and Statistics.
Harvey, Peter. 1999. “Open Database Connectivity.� Linux Journal Nov. (67): 68–72.
James, David A. In preparation. An R/S Interface to the Oracle Database. Bell Labs, Lucent Technologies.
R Data Import/Export. 2001. R-Development Core Team.
Siegel, Jon. 1996. CORBA Fundamentals and Programming. Wiley.
Temple Lang, Duncan. 2000. “The Omegahat Environment: New Possibilities for Statistical Computing.� Journal of Computational and Graphical Statistics to appear.
Using Relational Database Systems with R. 2000. R-Developemt Core Team.
X/Open CAE Specification: SQL and RDA. 1994. X/Open Company Ltd.

  1. A virtual class allows us to group classes that share some common functionality, e.g., the virtual class “dbConnection� groups all the connection implementations by Informix, Ingres, DB/2, Oracle, etc. Although the details will vary from one RDBMS to another, the defining characteristic of these objects is what a virtual class captures. R and S version 3 do not explicitly define virtual classes, but they can easily implement the idea through inheritance.↩︎

  2. The term “database� is sometimes (confusingly) used both to denote the RDBMS, such as Oracle, MySQL, and also to denote a particular database instance under a RDBMS, such as “opto� or “sales� databases under the same RDBMS.↩︎

DBI/inst/doc/DBI-1.Rmd0000644000176200001440000006004715144403222013576 0ustar liggesusers--- title: "A Common Database Interface (DBI)" author: "R-Databases Special Interest Group" date: "16 June 2003" output: rmarkdown::html_vignette bibliography: biblio.bib vignette: > %\VignetteIndexEntry{A Common Database Interface (DBI)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- This document describes a common interface between the S language (in its R and S-Plus implementations) and database management systems (DBMS). The interface defines a small set of classes and methods similar in spirit to Perl’s DBI, Java’s JDBC, Python’s DB-API, and Microsoft’s ODBC. # Version {#sec:version} This document describes version 0.1-6 of the database interface API (application programming interface). # Introduction {#sec:intro} The database interface (DBI) separates the connectivity to the DBMS into a “front-end� and a “back-end�. Applications use only the exposed “front-end� API. The facilities that communicate with specific DBMS (Oracle, PostgreSQL, etc.) are provided by “device drivers� that get invoked automatically by the S language evaluator. The following example illustrates some of the DBI capabilities: ```R ## Choose the proper DBMS driver and connect to the server drv <- dbDriver("ODBC") con <- dbConnect(drv, "dsn", "usr", "pwd") ## The interface can work at a higher level importing tables ## as data.frames and exporting data.frames as DBMS tables. dbListTables(con) dbListFields(con, "quakes") if(dbExistsTable(con, "new_results")) dbRemoveTable(con, "new_results") dbWriteTable(con, "new_results", new.output) ## The interface allows lower-level interface to the DBMS res <- dbSendQuery(con, paste( "SELECT g.id, g.mirror, g.diam, e.voltage", "FROM geom_table as g, elec_measures as e", "WHERE g.id = e.id and g.mirrortype = 'inside'", "ORDER BY g.diam")) out <- NULL while(!dbHasCompleted(res)){ chunk <- fetch(res, n = 10000) out <- c(out, doit(chunk)) } ## Free up resources dbClearResult(res) dbDisconnect(con) dbUnloadDriver(drv) ``` (only the first 2 expressions are DBMS-specific – all others are independent of the database engine itself). Individual DBI drivers need not implement all the features we list below (we indicate those that are optional). Furthermore, drivers may extend the core DBI facilities, but we suggest to have these extensions clearly indicated and documented. The following are the elements of the DBI: 1. A set of classes and methods (Section [sec:DBIClasses]) that defines what operations are possible and how they are defined, e.g.: - connect/disconnect to the DBMS - create and execute statements in the DBMS - extract results/output from statements - error/exception handling - information (meta-data) from database objects - transaction management (optional) Some things are left explicitly unspecified, e.g., authentication and even the query language, although it is hard to avoid references to SQL and relational database management systems (RDBMS). 2. Drivers Drivers are collection of functions that implement the functionality defined above in the context of specific DBMS, e.g., mSQL, Informix. 3. Data type mappings (Section [sec:data-mappings].) Mappings and conversions between DBMS data types and R/S objects. All drivers should implement the “basic� primitives (see below), but may chose to add user-defined conversion function to handle more generic objects (e.g., factors, ordered factors, time series, arrays, images). 4. Utilities (Section [sec:utilities].) These facilities help with details such as mapping of identifiers between S and DBMS (e.g., `_` is illegal in R/S names, and `.` is used for constructing compound SQL identifiers), etc. # DBI Classes and Methods {#sec:DBIClasses} The following are the main DBI classes. They need to be extended by individual database back-ends (Sybase, Oracle, etc.) Individual drivers need to provide methods for the generic functions listed here (those methods that are optional are so indicated). *Note: Although R releases prior to 1.4 do not have a formal concept of classes, we will use the syntax of the S Version 4 classes and methods (available in R releases 1.4 and later as library `methods`) to convey precisely the DBI class hierarchy, its methods, and intended behavior.* The DBI classes are `DBIObject`, `DBIDriver`, `DBIConnection` and `DBIResult`. All these are *virtual* classes. Drivers define new classes that extend these, e.g., `PgSQLDriver`, `PgSQLConnection`, and so on. ![Class hierarchy for the DBI. The top two layers are comprised of virtual classes and each lower layer represents a set of driver-specific implementation classes that provide the functionality defined by the virtual classes above.](hierarchy.png) `DBIObject`: : Virtual class[^1] that groups all other DBI classes. `DBIDriver`: : Virtual class that groups all DBMS drivers. Each DBMS driver extends this class. Typically generator functions instantiate the actual driver objects, e.g., `PgSQL`, `HDF5`, `BerkeleyDB`. `DBIConnection`: : Virtual class that encapsulates connections to DBMS. `DBIResult`: : Virtual class that describes the result of a DBMS query or statement. [Q: Should we distinguish between a simple result of DBMS statements e.g., as `delete` from DBMS queries (i.e., those that generate data).] The methods `format`, `print`, `show`, `dbGetInfo`, and `summary` are defined (and *implemented* in the `DBI` package) for the `DBIObject` base class, thus available to all implementations; individual drivers, however, are free to override them as they see fit. `format(x, ...)`: : produces a concise character representation (label) for the `DBIObject` `x`. `print(x, ...)`/`show(x)`: : prints a one-line identification of the object `x`. `summary(object, ...)`: : produces a concise description of the object. The default method for `DBIObject` simply invokes `dbGetInfo(dbObj)` and prints the name-value pairs one per line. Individual implementations may tailor this appropriately. `dbGetInfo(dbObj, ...)`: : extracts information (meta-data) relevant for the `DBIObject` `dbObj`. It may return a list of key/value pairs, individual meta-data if supplied in the call, or `NULL` if the requested meta-data is not available. *Hint:* Driver implementations may choose to allow an argument `what` to specify individual meta-data, e.g., `dbGetInfo(drv, what = max.connections)`. In the next few sub-sections we describe in detail each of these classes and their methods. ## Class `DBIObject` {#sec:DBIObject} This class simply groups all DBI classes, and thus all extend it. ## Class `DBIDriver` {#sec:DBIDriver} This class identifies the database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The DBI provides the generator `dbDriver(driverName)` which simply invokes the function `driverName`, which in turn instantiates the corresponding driver object. The `DBIDriver` class defines the following methods: `driverName`: : [meth:driverName] initializes the driver code. The name `driverName` refers to the actual generator function for the DBMS, e.g., `RPgSQL`, `RODBC`, `HDF5`. The driver instance object is used with `dbConnect` (see page ) for opening one or possibly more connections to one or more DBMS. `dbListConnections(drv, ...)`: : list of current connections being handled by the `drv` driver. May be `NULL` if there are no open connections. Drivers that do not support multiple connections may return the one open connection. `dbGetInfo(dbObj, ...)`: : returns a list of name-value pairs of information about the driver. *Hint:* Useful entries could include `name`: : the driver name (e.g., `RODBC`, `RPgSQL`); `driver.version`: : version of the driver; `DBI.version`: : the version of the DBI that the driver implements, e.g., `0.1-2`; `client.version`: : of the client DBMS libraries (e.g., version of the `libpq` library in the case of `RPgSQL`); `max.connections`: : maximum number of simultaneous connections; plus any other relevant information about the implementation, for instance, how the driver handles upper/lower case in identifiers. `dbUnloadDriver(driverName)` (optional): : frees all resources (local and remote) used by the driver. Returns a logical to indicate if it succeeded or not. ## Class `DBIConnection` {#sec:DBIConnection} This virtual class encapsulates the connection to a DBMS, and it provides access to dynamic queries, result sets, DBMS session management (transactions), etc. *Note:* Individual drivers are free to implement single or multiple simultaneous connections. The methods defined by the `DBIConnection` class include: `dbConnect(drv, ...)`: : [meth:dbConnect] creates and opens a connection to the database implemented by the driver `drv` (see Section [sec:DBIDriver]). Each driver will define what other arguments are required, e.g., `dbname` or `dsn` for the database name, `user`, and `password`. It returns an object that extends `DBIConnection` in a driver-specific manner (e.g., the MySQL implementation could create an object of class `MySQLConnection` that extends `DBIConnection`). `dbDisconnect(conn, ...)`: : closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). Returns a logical indicating whether it succeeded or not. `dbSendQuery(conn, statement, ...)`: : submits one statement to the DBMS. It returns a `DBIResult` object. This object is needed for fetching data in case the statement generates output (see `fetch` on page ), and it may be used for querying the state of the operation; see `dbGetInfo` and other meta-data methods on page . `dbGetQuery(conn, statement, ...)`: : submit, execute, and extract output in one operation. The resulting object may be a `data.frame` if the `statement` generates output. Otherwise the return value should be a logical indicating whether the query succeeded or not. `dbGetException(conn, ...)`: : returns a list with elements `errNum` and `errMsg` with the status of the last DBMS statement sent on a given connection (this information may also be provided by the `dbGetInfo` meta-data function on the `conn` object. *Hint:* The ANSI SQL-92 defines both a status code and an status message that could be return as members of the list. `dbGetInfo(dbObj, ...)`: : returns a list of name-value pairs describing the state of the connection; it may return one or more meta-data, the actual driver method allows to specify individual pieces of meta-data (e.g., maximum number of open results/cursors). *Hint:* Useful entries could include `dbname`: : the name of the database in use; `db.version`: : the DBMS server version (e.g., “Oracle 8.1.7 on Solaris�; `host`: : host where the database server resides; `user`: : user name; `password`: : password (is this safe?); plus any other arguments related to the connection (e.g., thread id, socket or TCP connection type). `dbListResults(conn, ...)`: : list of `DBIResult` objects currently active on the connection `conn`. May be `NULL` if no result set is active on `conn`. Drivers that implement only one result set per connection could return that one object (no need to wrap it in a list). *Note: The following are convenience methods that simplify the import/export of (mainly) data.frames. The first five methods implement the core methods needed to `attach` remote DBMS to the S search path. (For details, see @data-management:1991 [@database-classes:1999].)* *Hint:* For relational DBMS these methods may be easily implemented using the core DBI methods `dbConnect`, `dbSendQuery`, and `fetch`, due to SQL reflectance (i.e., one easily gets this meta-data by querying the appropriate tables on the RDBMS). `dbListTables(conn, ...)`: : returns a character vector (possibly of zero-length) of object (table) names available on the `conn` connection. `dbReadTable(conn, name, ...)`: : imports the data stored remotely in the table `name` on connection `conn`. Use the field `row.names` as the `row.names` attribute of the output data.frame. Returns a `data.frame`. [Q: should we spell out how row.names should be created? E.g., use a field (with unique values) as row.names? Also, should `dbReadTable` reproduce a data.frame exported with `dbWriteTable`?] `dbWriteTable(conn, name, value, ...)`: : write the object `value` (perhaps after coercing it to data.frame) into the remote object `name` in connection `conn`. Returns a logical indicating whether the operation succeeded or not. `dbExistsTable(conn, name, ...)`: : does remote object `name` exist on `conn`? Returns a logical. `dbRemoveTable(conn, name, ...)`: : removes remote object `name` on connection `conn`. Returns a logical indicating whether the operation succeeded or not. `dbListFields(conn, name, ...)`: : returns a character vector listing the field names of the remote table `name` on connection `conn` (see `dbColumnInfo()` for extracting data type on a table). *Note: The following methods deal with transactions and stored procedures. All these functions are optional.* `dbCommit(conn, ...)`(optional): : commits pending transaction on the connection and returns `TRUE` or `FALSE` depending on whether the operation succeeded or not. `dbRollback(conn, ...)`(optional): : undoes current transaction on the connection and returns `TRUE` or `FALSE` depending on whether the operation succeeded or not. `dbCallProc(conn, storedProc, ...)`(optional): : invokes a stored procedure in the DBMS and returns a `DBIResult` object. [Stored procedures are *not* part of the ANSI SQL-92 standard and vary substantially from one RDBMS to another.] **Deprecated since 2014:** The recommended way of calling a stored procedure is now - `dbGetQuery` if a result set is returned and - `dbExecute` for data manipulation and other cases that do not return a result set. ## Class `DBIResult` {#sec:DBIResult} This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query). The result set `res` keeps track of whether the statement produces output for R/S, how many rows were affected by the operation, how many rows have been fetched (if statement is a query), whether there are more rows to fetch, etc. *Note: Individual drivers are free to allow single or multiple active results per connection.* [Q: Should we distinguish between results that return no data from those that return data?] The class `DBIResult` defines the following methods: `fetch(res, n, ...)`: : [meth:fetch] fetches the next `n` elements (rows) from the result set `res` and return them as a data.frame. A value of `n=-1` is interpreted as “return all elements/rows�. `dbClearResult(res, ...)`: : flushes any pending data and frees all resources (local and remote) used by the object `res` on both sides of the connection. Returns a logical indicating success or not. `dbGetInfo(dbObj, ...)`: : returns a name-value list with the state of the result set. *Hint:* Useful entries could include `statement`: : a character string representation of the statement being executed; `rows.affected`: : number of affected records (changed, deleted, inserted, or extracted); `row.count`: : number of rows fetched so far; `has.completed`: : has the statement (query) finished? `is.select`: : a logical describing whether or not the statement generates output; plus any other relevant driver-specific meta-data. `dbColumnInfo(res, ...)`: : produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame should describe an aspect of the result set field (field name, type, etc.) *Hint:* The data.frame columns could include `field.name`: : DBMS field label; `field.type`: : DBMS field type (implementation-specific); `data.type`: : corresponding R/S data type, e.g., `integer`; `precision`/`scale`: : (as in ODBC terminology), display width and number of decimal digits, respectively; `nullable`: : whether the corresponding field may contain (DBMS) `NULL` values; plus other driver-specific information. `dbSetDataMappings(flds, ...)`(optional): : defines a conversion between internal DBMS data types and R/S classes. We expect the default mappings (see Section [sec:data-mappings]) to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. [This topic needs further discussion.] *Note: The following are convenience methods that extract information from the result object (they may be implemented by invoking `dbGetInfo` with appropriate arguments).* `dbGetStatement(res, ...)`(optional): : returns the DBMS statement (as a character string) associated with the result `res`. `dbGetRowsAffected(res, ...)`(optional): : returns the number of rows affected by the executed statement (number of records deleted, modified, extracted, etc.) `dbHasCompleted(res, ...)`(optional): : returns a logical that indicates whether the operation has been completed (e.g., are there more records to be fetched?). `dbGetRowCount(res, ...)`(optional): : returns the number of rows fetched so far. # Data Type Mappings {#sec:data-mappings} The data types supported by databases are different than the data types in R and S, but the mapping between the “primitive� types is straightforward: Any of the many fixed and varying length character types are mapped to R/S `character`. Fixed-precision (non-IEEE) numbers are mapped into either doubles (`numeric`) or long (`integer`). Notice that many DBMS do not follow the so-called IEEE arithmetic, so there are potential problems with under/overflows and loss of precision, but given the R/S primitive types we cannot do too much but identify these situations and warn the application (how?). By default dates and date-time objects are mapped to character using the appropriate `TO_CHAR` function in the DBMS (which should take care of any locale information). Some RDBMS support the type `CURRENCY` or `MONEY` which should be mapped to `numeric` (again with potential round off errors). Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion (as has been done in other inter-systems packages [^2]). Specifying user-defined conversion functions still needs to be defined. # Utilities {#sec:utilities} The core DBI implementation should make available to all drivers some common basic utilities. For instance: `dbGetDBIVersion`: : returns the version of the currently attached DBI as a string. `dbDataType(dbObj, obj, ...)`: : returns a string with the (approximately) appropriate data type for the R/S object `obj`. The DBI can implement this following the ANSI-92 standard, but individual drivers may want/need to extend it to make use of DBMS-specific types. `make.db.names(dbObj, snames, ...)`: : maps R/S names (identifiers) to SQL identifiers replacing illegal characters (as `.`) by the legal SQL `_`. `SQLKeywords(dbObj, ...)`: : returns a character vector of SQL keywords (reserved words). The default method returns the list of `.SQL92Keywords`, but drivers should update this vector with the DBMS-specific additional reserved words. `isSQLKeyword(dbObj, name, ...)`: : for each element in the character vector `name` determine whether or not it is an SQL keyword, as reported by the generic function `SQLKeywords`. Returns a logical vector parallel to the input object `name`. # Open Issues and Limitations {#sec:open-issues} There are a number of issues and limitations that the current DBI conscientiously does not address on the interest of simplicity. We do list here the most important ones. Non-SQL: : Is it realistic to attempt to encompass non-relational databases, like HDF5, Berkeley DB, etc.? Security: : allowing users to specify their passwords on R/S scripts may be unacceptable for some applications. We need to consider alternatives where users could store authentication on files (perhaps similar to ODBC’s `odbc.ini`) with more stringent permissions. Exceptions: : the exception mechanism is a bit too simple, and it does not provide for information when problems stem from the DBMS interface itself. For instance, under/overflow or loss of precision as we move numeric data from DBMS to the more limited primitives in R/S. Asynchronous communication: : most DBMS support both synchronous and asynchronous communications, allowing applications to submit a query and proceed while the database server process the query. The application is then notified (or it may need to poll the server) when the query has completed. For large computations, this could be very useful, but the DBI would need to specify how to interrupt the server (if necessary) plus other details. Also, some DBMS require applications to use threads to implement asynchronous communication, something that neither R nor S-Plus currently addresses. SQL scripts: : the DBI only defines how to execute one SQL statement at a time, forcing users to split SQL scripts into individual statements. We need a mechanism by which users can submit SQL scripts that could possibly generate multiple result sets; in this case we may need to introduce new methods to loop over multiple results (similar to Python’s `nextResultSet`). BLOBS/CLOBS: : large objects (both character and binary) present some challenges both to R and S-Plus. It is becoming more common to store images, sounds, and other data types as binary objects in DBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects. Transactions: : transaction management is not fully described. Additional methods: : Do we need any additional methods? (e.g., `dbListDatabases(conn)`, `dbListTableIndices(conn, name)`, how do we list all available drivers?) Bind variables: : the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variables�; this is a mechanism by which the contents of R/S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement /* SQL */ SELECT * from emp_table where emp_id = :sampleEmployee would take the vector `sampleEmployee` and iterate over each of its elements to get the result. Perhaps the DBI could at some point in the future implement this feature. # Resources {#sec:resources} The idea of a common interface to databases has been successfully implemented in various environments, for instance: Java’s Database Connectivity (JDBC) ([www.javasoft.com](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/)). In C through the Open Database Connectivity (ODBC) ([www.unixodbc.org](https://www.unixodbc.org/)). Python’s Database Application Programming Interface ([www.python.org](https://wiki.python.org/python/DatabaseProgramming.html)). Perl’s Database Interface ([dbi.perl.org](https://dbi.perl.org)). [^1]: A virtual class allows us to group classes that share some common characteristics, even if their implementations are radically different. [^2]: Duncan Temple Lang has volunteered to port the data conversion code found in R-Java, R-Perl, and R-Python packages to the DBI DBI/inst/doc/DBI.R0000644000176200001440000000360615147357126013133 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) ## ----------------------------------------------------------------------------- library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListTables(con) dbDisconnect(con) ## ----eval = FALSE------------------------------------------------------------- # con <- dbConnect( # RMariaDB::MariaDB(), # host = "relational.fel.cvut.cz", # port = 3306, # username = "guest", # password = keyring::key_get("relational.fel.cvut.cz", "guest"), # dbname = "sakila" # ) ## ----------------------------------------------------------------------------- con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListFields(con, "film") ## ----------------------------------------------------------------------------- df <- dbReadTable(con, "film") head(df, 3) ## ----------------------------------------------------------------------------- df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006") head(df, 3) ## ----------------------------------------------------------------------------- df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006 AND rating = 'G'") head(df, 3) ## ----message=FALSE------------------------------------------------------------ library(dplyr) lazy_df <- tbl(con, "film") %>% filter(release_year == 2006 & rating == "G") %>% select(film_id, title, description) head(lazy_df, 3) ## ----------------------------------------------------------------------------- dbDisconnect(con) DBI/inst/doc/spec.html0000644000176200001440000110262215147357131014225 0ustar liggesusers DBI specification

DBI specification

Kirill Müller

Abstract

The DBI package defines the generic DataBase Interface for R. The connection to individual DBMS is provided by other packages that import DBI (so-called DBI backends). This document formalizes the behavior expected by the methods declared in DBI and implemented by the individual backends. To ensure maximum portability and exchangeability, and to reduce the effort for implementing a new DBI backend, the DBItest package defines a comprehensive set of test cases that test conformance to the DBI specification. This document is derived from comments in the test definitions of the DBItest package. Any extensions or updates to the tests will be reflected in this document.

DBI: R Database Interface

DBI defines an interface for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations (so-called DBI backends).

Definition

A DBI backend is an R package which imports the DBI and methods packages. For better or worse, the names of many existing backends start with ‘R’, e.g., RSQLite, RMySQL, RSQLServer; it is up to the backend author to adopt this convention or not.

DBI classes and methods

A backend defines three classes, which are subclasses of DBIDriver, DBIConnection, and DBIResult. The backend provides implementation for all methods of these base classes that are defined but not implemented by DBI. All methods defined in DBI are reexported (so that the package can be used without having to attach DBI), and have an ellipsis ... in their formals for extensibility.

Construction of the DBIDriver object

The backend must support creation of an instance of its DBIDriver subclass with a constructor function. By default, its name is the package name without the leading ‘R’ (if it exists), e.g., SQLite for the RSQLite package. However, backend authors may choose a different name. The constructor must be exported, and it must be a function that is callable without arguments. DBI recommends to define a constructor with an empty argument list.

Examples

RSQLite::SQLite()

Determine the SQL data type of an object

This section describes the behavior of the following method:

dbDataType(dbObj, obj, ...)

Description

Returns an SQL string that describes the SQL data type to be used for an object. The default implementation of this generic determines the SQL type of an R object according to the SQL 92 specification, which may serve as a starting point for driver implementations. DBI also provides an implementation for data.frame which will return a character vector giving the type for each column in the dataframe.

Arguments

dbObj A object inheriting from DBIDriver or DBIConnection
obj An R object whose SQL type we want to determine.
... Other arguments passed on to methods.

Details

The data types supported by databases are different than the data types in R, but the mapping between the primitive types is straightforward:

  • Any of the many fixed and varying length character types are mapped to character vectors

  • Fixed-precision (non-IEEE) numbers are mapped into either numeric or integer vectors.

Notice that many DBMS do not follow IEEE arithmetic, so there are potential problems with under/overflows and loss of precision.

Value

dbDataType() returns the SQL type that corresponds to the obj argument as a non-empty character string. For data frames, a character vector with one element per column is returned.

Failure modes

An error is raised for invalid values for the obj argument such as a NULL value.

Specification

The backend can override the dbDataType() generic for its driver class.

This generic expects an arbitrary object as second argument. To query the values returned by the default implementation, run example(dbDataType, package = "DBI"). If the backend needs to override this generic, it must accept all basic R data types as its second argument, namely logical, integer, numeric, character, dates (see Dates), date-time (see DateTimeClasses), and difftime. If the database supports blobs, this method also must accept lists of raw vectors, and blob::blob objects. As-is objects (i.e., wrapped by I()) must be supported and return the same results as their unwrapped counterparts. The SQL data type for factor and ordered is the same as for character. The behavior for other object types is not specified.

All data types returned by dbDataType() are usable in an SQL statement of the form "CREATE TABLE test (a ...)".

Examples

dbDataType(ANSI(), 1:5)
dbDataType(ANSI(), 1)
dbDataType(ANSI(), TRUE)
dbDataType(ANSI(), Sys.Date())
dbDataType(ANSI(), Sys.time())
dbDataType(ANSI(), Sys.time() - as.POSIXct(Sys.Date()))
dbDataType(ANSI(), c("x", "abc"))
dbDataType(ANSI(), list(raw(10), raw(20)))
dbDataType(ANSI(), I(3))

dbDataType(ANSI(), iris)


con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbDataType(con, 1:5)
dbDataType(con, 1)
dbDataType(con, TRUE)
dbDataType(con, Sys.Date())
dbDataType(con, Sys.time())
dbDataType(con, Sys.time() - as.POSIXct(Sys.Date()))
dbDataType(con, c("x", "abc"))
dbDataType(con, list(raw(10), raw(20)))
dbDataType(con, I(3))

dbDataType(con, iris)

dbDisconnect(con)

Create a connection to a DBMS

This section describes the behavior of the following method:

dbConnect(drv, ...)

Description

Connect to a DBMS going through the appropriate authentication procedure. Some implementations may allow you to have multiple connections open, so you may invoke this function repeatedly assigning its output to different objects. The authentication mechanism is left unspecified, so check the documentation of individual drivers for details. Use dbCanConnect() to check if a connection can be established.

Arguments

drv An object that inherits from DBIDriver, or an existing DBIConnection object (in order to clone an existing connection).
... Authentication arguments needed by the DBMS instance; these typically include user, password, host, port, dbname, etc. For details see the appropriate DBIDriver.

Value

dbConnect() returns an S4 object that inherits from DBIConnection. This object is used to communicate with the database engine.

A format() method is defined for the connection object. It returns a string that consists of a single line of text.

Specification

DBI recommends using the following argument names for authentication parameters, with NULL default:

  • user for the user name (default: current user)

  • password for the password

  • host for the host name (default: local connection)

  • port for the port number (default: local connection)

  • dbname for the name of the database on the host, or the database file name

The defaults should provide reasonable behavior, in particular a local connection for host = NULL. For some DBMS (e.g., PostgreSQL), this is different to a TCP/IP connection to localhost.

In addition, DBI supports the bigint argument that governs how 64-bit integer data is returned. The following values are supported:

  • "integer": always return as integer, silently overflow

  • "numeric": always return as numeric, silently round

  • "character": always return the decimal representation as character

  • "integer64": return as a data type that can be coerced using as.integer() (with warning on overflow), as.numeric() and as.character()

Examples

# SQLite only needs a path to the database. (Here, ":memory:" is a special
# path that creates an in-memory database.) Other database drivers
# will require more details (like user, password, host, port, etc.)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
con

dbListTables(con)

dbDisconnect(con)

# Bad, for subtle reasons:
# This code fails when RSQLite isn't loaded yet,
# because dbConnect() doesn't know yet about RSQLite.
dbListTables(con <- dbConnect(RSQLite::SQLite(), ":memory:"))

Disconnect (close) a connection

This section describes the behavior of the following method:

dbDisconnect(conn, ...)

Description

This closes the connection, discards all pending work, and frees resources (e.g., memory, sockets).

Arguments

conn A DBIConnection object, as returned by dbConnect().
... Other parameters passed on to methods.

Value

dbDisconnect() returns TRUE, invisibly.

Failure modes

A warning is issued on garbage collection when a connection has been released without calling dbDisconnect(), but this cannot be tested automatically. At least one warning is issued immediately when calling dbDisconnect() on an already disconnected or invalid connection.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbDisconnect(con)

Execute a query on a given database connection

This section describes the behavior of the following method:

dbSendQuery(conn, statement, ...)

Description

The dbSendQuery() method only submits and synchronously executes the SQL query to the database engine. It does not extract any records — for that you need to use the dbFetch() method, and then you must call dbClearResult() when you finish fetching the records you need. For interactive use, you should almost always prefer dbGetQuery(). Use dbSendQueryArrow() or dbGetQueryArrow() instead to retrieve the results as an Arrow object.

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbSendQuery() generic (to improve compatibility across backends) but are part of the DBI specification:

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� sections for details on their usage.

Specification

No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to dbClearResult(). Failure to clear the result set leads to a warning when the connection is closed.

If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with dbClearResult().

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

This method is for SELECT queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use dbSendStatement() for data manipulation statements.

The query is submitted to the database server and the DBMS executes it, possibly generating vast amounts of data. Where these data live is driver-specific: some drivers may choose to leave the output on the server and transfer them piecemeal to R, others may transfer all the data to the client – but not necessarily to the memory that R manages. See individual drivers’ dbSendQuery() documentation for details.

Value

dbSendQuery() returns an S4 object that inherits from DBIResult. The result set can be used with dbFetch() to extract records. Once you have finished using a result, make sure to clear it with dbClearResult().

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-NA string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the params argument) or the immediate argument is set to TRUE.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(rs)
dbClearResult(rs)

# Pass one set of values with the param argument:
rs <- dbSendQuery(
  con,
  "SELECT * FROM mtcars WHERE cyl = ?",
  params = list(4L)
)
dbFetch(rs)
dbClearResult(rs)

# Pass multiple sets of values with dbBind():
rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = ?")
dbBind(rs, list(6L))
dbFetch(rs)
dbBind(rs, list(8L))
dbFetch(rs)
dbClearResult(rs)

dbDisconnect(con)

Fetch records from a previously executed query

This section describes the behavior of the following methods:

dbFetch(res, n = -1, ...)

fetch(res, n = -1, ...)

Description

Fetch the next n elements (rows) from the result set and return them as a data.frame.

Arguments

res An object inheriting from DBIResult, created by dbSendQuery().
n maximum number of records to retrieve per fetch. Use n = -1 or n = Inf to retrieve all pending records. Some implementations may recognize other special values.
... Other arguments passed on to methods.

Details

fetch() is provided for compatibility with older DBI clients - for all new code you are strongly encouraged to use dbFetch(). The default implementation for dbFetch() calls fetch() so that it is compatible with existing code. Modern backends should implement for dbFetch() only.

Value

dbFetch() always returns a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. Passing n = NA is supported and returns an arbitrary number of rows (at least one) as specified by the driver, but at most the remaining rows in the result set.

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An attempt to fetch from a closed result set raises an error. If the n argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to dbFetch() with proper n argument succeeds.

Calling dbFetch() on a result set from a data manipulation query created by dbSendStatement() can be fetched and return an empty data frame, with a warning.

Specification

Fetching multi-row queries with one or more columns by default returns the entire result. Multi-row queries can also be fetched progressively by passing a whole number (integer or numeric) as the n argument. A value of Inf for the n argument is supported and also returns the full result. If more rows than available are fetched, the result is returned in full without warning. If fewer rows than requested are returned, further fetches will return a data frame with zero rows. If zero rows are fetched, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued when clearing the result set.

A column named row_names is treated like any other column.

The column types of the returned data frame depend on the data returned:

  • integer (or coercible to an integer) for integer values between -2^31 and 2^31 - 1, with NA for SQL NULL values

  • numeric for numbers with a fractional component, with NA for SQL NULL values

  • logical for Boolean values (some backends may return an integer); with NA for SQL NULL values

  • character for text, with NA for SQL NULL values

  • lists of raw for blobs with NULL entries for SQL NULL values

  • coercible using as.Date() for dates, with NA for SQL NULL values (also applies to the return value of the SQL function current_date)

  • coercible using hms::as_hms() for times, with NA for SQL NULL values (also applies to the return value of the SQL function current_time)

  • coercible using as.POSIXct() for timestamps, with NA for SQL NULL values (also applies to the return value of the SQL function current_timestamp)

If dates and timestamps are supported by the backend, the following R types are used:

  • Date for dates (also applies to the return value of the SQL function current_date)

  • POSIXct for timestamps (also applies to the return value of the SQL function current_timestamp)

R has no built-in type with lossless support for the full range of 64-bit or larger integers. If 64-bit integers are returned from a query, the following rules apply:

  • Values are returned in a container with support for the full range of valid 64-bit values (such as the integer64 class of the bit64 package)

  • Coercion to numeric always returns a number that is as close as possible to the true value

  • Loss of precision when converting to numeric gives a warning

  • Conversion to character always returns a lossless decimal representation of the data

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)

# Fetch all results
rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(rs)
dbClearResult(rs)

# Fetch in chunks
rs <- dbSendQuery(con, "SELECT * FROM mtcars")
while (!dbHasCompleted(rs)) {
  chunk <- dbFetch(rs, 10)
  print(nrow(chunk))
}

dbClearResult(rs)
dbDisconnect(con)

Clear a result set

This section describes the behavior of the following method:

dbClearResult(res, ...)

Description

Frees all resources (local and remote) associated with a result set. This step is mandatory for all objects obtained by calling dbSendQuery() or dbSendStatement().

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbClearResult() returns TRUE, invisibly, for result sets obtained from dbSendQuery(), dbSendStatement(), or dbSendQueryArrow(),

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

The command execution flow

This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of dbBindArrow(), is implemented by dbExecute(), which should be sufficient for non-parameterized queries. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendStatement() to create a result set object of class DBIResult. For some queries you need to pass immediate = TRUE.

  2. Optionally, bind query parameters withdbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbGetRowsAffected() to retrieve the number of rows affected by the query.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An attempt to close an already closed result set issues a warning for dbSendQuery(), dbSendStatement(), and dbSendQueryArrow(),

Specification

dbClearResult() frees all resources associated with retrieving the result of a query or update operation. The DBI backend can expect a call to dbClearResult() for each dbSendQuery() or dbSendStatement() call.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

rs <- dbSendQuery(con, "SELECT 1")
print(dbFetch(rs))

dbClearResult(rs)
dbDisconnect(con)

Bind values to a parameterized/prepared statement

This section describes the behavior of the following methods:

dbBind(res, params, ...)

dbBindArrow(res, params, ...)

Description

For parametrized or prepared statements, the dbSendQuery(), dbSendQueryArrow(), and dbSendStatement() functions can be called with statements that contain placeholders for values. The dbBind() and dbBindArrow() functions bind these placeholders to actual values, and are intended to be called on the result set before calling dbFetch() or dbFetchArrow(). The values are passed to dbBind() as lists or data frames, and to dbBindArrow() as a stream created by nanoarrow::as_nanoarrow_array_stream().

Experimental

dbBindArrow() is experimental, as are the other �*Arrow� functions. dbSendQuery() is compatible with dbBindArrow(), and dbSendQueryArrow() is compatible with dbBind().

Arguments

res An object inheriting from DBIResult.
params For dbBind(), a list of values, named or unnamed, or a data frame, with one element/column per query parameter. For dbBindArrow(), values as a nanoarrow stream, with one column per query parameter.
... Other arguments passed on to methods.

Details

DBI supports parametrized (or prepared) queries and statements via the dbBind() and dbBindArrow() generics. Parametrized queries are different from normal queries in that they allow an arbitrary number of placeholders, which are later substituted by actual values. Parametrized queries (and statements) serve two purposes:

  • The same query can be executed more than once with different values. The DBMS may cache intermediate information for the query, such as the execution plan, and execute it faster.

  • Separation of query syntax and parameters protects against SQL injection.

The placeholder format is currently not specified by DBI; in the future, a uniform placeholder syntax may be supported. Consult the backend documentation for the supported formats. For automated testing, backend authors specify the placeholder syntax with the placeholder_pattern tweak. Known examples are:

  • â� ?â�  (positional matching in order of appearance) in RMariaDB and RSQLite

  • â� \$1â�  (positional matching by index) in RPostgres and RSQLite

  • â� :nameâ�  and â� \$nameâ�  (named matching) in RSQLite

Value

dbBind() returns the result set, invisibly, for queries issued by dbSendQuery() or dbSendQueryArrow() and also for data manipulation statements issued by dbSendStatement().

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

The data retrieval flow for Arrow streams

This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream.

Most of this flow, except repeated calling of dbBindArrow() or dbBind(), is implemented by dbGetQueryArrow(), which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQueryArrow() to create a result set object of class DBIResultArrow.

  2. Optionally, bind query parameters with dbBindArrow() or dbBind(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Use dbFetchArrow() to get a data stream.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

The command execution flow

This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of dbBindArrow(), is implemented by dbExecute(), which should be sufficient for non-parameterized queries. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendStatement() to create a result set object of class DBIResult. For some queries you need to pass immediate = TRUE.

  2. Optionally, bind query parameters withdbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbGetRowsAffected() to retrieve the number of rows affected by the query.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

Calling dbBind() for a query without parameters raises an error.

Binding too many or not enough values, or parameters with wrong names or unequal length, also raises an error. If the placeholders in the query are named, all parameter values must have names (which must not be empty or NA), and vice versa, otherwise an error is raised. The behavior for mixing placeholders of different types (in particular mixing positional and named placeholders) is not specified.

Calling dbBind() on a result set already cleared by dbClearResult() also raises an error.

Specification

DBI clients execute parametrized statements as follows:

  1. Call dbSendQuery(), dbSendQueryArrow() or dbSendStatement() with a query or statement that contains placeholders, store the returned DBIResult object in a variable. Mixing placeholders (in particular, named and unnamed ones) is not recommended. It is good practice to register a call to dbClearResult() via on.exit() right after calling dbSendQuery() or dbSendStatement() (see the last enumeration item). Until dbBind() or dbBindArrow() have been called, the returned result set object has the following behavior:

    • dbFetch() raises an error (for dbSendQuery() and dbSendQueryArrow())

    • dbGetRowCount() returns zero (for dbSendQuery() and dbSendQueryArrow())

    • dbGetRowsAffected() returns an integer NA (for dbSendStatement())

    • dbIsValid() returns TRUE

    • dbHasCompleted() returns FALSE

  2. Call dbBind() or dbBindArrow():

    • For dbBind(), the params argument must be a list where all elements have the same lengths and contain values supported by the backend. A data.frame is internally stored as such a list.

    • For dbBindArrow(), the params argument must be a nanoarrow array stream, with one column per query parameter.

  3. Retrieve the data or the number of affected rows from the DBIResult object.

    • For queries issued by dbSendQuery() or dbSendQueryArrow(), call dbFetch().

    • For statements issued by dbSendStatements(), call dbGetRowsAffected(). (Execution begins immediately after the dbBind() call, the statement is processed entirely before the function returns.)

  4. Repeat 2. and 3. as necessary.

  5. Close the result set via dbClearResult().

The elements of the params argument do not need to be scalars, vectors of arbitrary length (including length 0) are supported. For queries, calling dbFetch() binding such parameters returns concatenated results, equivalent to binding and fetching for each set of values and connecting via rbind(). For data manipulation statements, dbGetRowsAffected() returns the total number of rows affected if binding non-scalar parameters. dbBind() also accepts repeated calls on the same result set for both queries and data manipulation statements, even if no results are fetched between calls to dbBind(), for both queries and data manipulation statements.

If the placeholders in the query are named, their order in the params argument is not important.

At least the following data types are accepted on input (including NA):

  • integer

  • numeric

  • logical for Boolean values

  • character (also with special characters such as spaces, newlines, quotes, and backslashes)

  • factor (bound as character, with warning)

  • Date (also when stored internally as integer)

  • POSIXct timestamps

  • POSIXlt timestamps

  • difftime values (also with units other than seconds and with the value stored as integer)

  • lists of raw for blobs (with NULL entries for SQL NULL values)

  • objects of type blob::blob

Examples

# Data frame flow:
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "iris", iris)

# Using the same query for different values
iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > ?")
dbBind(iris_result, list(2.3))
dbFetch(iris_result)
dbBind(iris_result, list(3))
dbFetch(iris_result)
dbClearResult(iris_result)

# Executing the same statement with different values at once
iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = \$species")
dbBind(iris_result, list(species = c("setosa", "versicolor", "unknown")))
dbGetRowsAffected(iris_result)
dbClearResult(iris_result)

nrow(dbReadTable(con, "iris"))

dbDisconnect(con)



# Arrow flow:
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "iris", iris)

# Using the same query for different values
iris_result <- dbSendQueryArrow(con, "SELECT * FROM iris WHERE [Petal.Width] > ?")
dbBindArrow(
  iris_result,
  nanoarrow::as_nanoarrow_array_stream(data.frame(2.3, fix.empty.names = FALSE))
)
as.data.frame(dbFetchArrow(iris_result))
dbBindArrow(
  iris_result,
  nanoarrow::as_nanoarrow_array_stream(data.frame(3, fix.empty.names = FALSE))
)
as.data.frame(dbFetchArrow(iris_result))
dbClearResult(iris_result)

# Executing the same statement with different values at once
iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = \$species")
dbBindArrow(iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame(
  species = c("setosa", "versicolor", "unknown")
)))
dbGetRowsAffected(iris_result)
dbClearResult(iris_result)

nrow(dbReadTable(con, "iris"))

dbDisconnect(con)

Retrieve results from a query

This section describes the behavior of the following method:

dbGetQuery(conn, statement, ...)

Description

Returns the result of a query as a data frame. dbGetQuery() comes with a default implementation (which should work with most backends) that calls dbSendQuery(), then dbFetch(), ensuring that the result is always freed by dbClearResult(). For retrieving chunked/paged results or for passing query parameters, see dbSendQuery(), in particular the “The data retrieval flow� section. For retrieving results as an Arrow object, see dbGetQueryArrow().

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbGetQuery() generic (to improve compatibility across backends) but are part of the DBI specification:

  • n (default: -1)

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

Specification

A column named row_names is treated like any other column.

The n argument specifies the number of rows to be fetched. If omitted, fetching multi-row queries with one or more columns returns the entire result. A value of Inf for the n argument is supported and also returns the full result. If more rows than available are fetched (by passing a too large value for n), the result is returned in full without warning. If zero rows are requested, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued.

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

This method is for SELECT queries only (incl. other SQL statements that return a SELECT-alike result, e.g., execution of a stored procedure or data manipulation queries like �INSERT INTO ... RETURNING ...�). To execute a stored procedure that does not return a result set, use dbExecute().

Some backends may support data manipulation statements through this method for compatibility reasons. However, callers are strongly advised to use dbExecute() for data manipulation statements.

Value

dbGetQuery() always returns a data.frame, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows.

Implementation notes

Subclasses should override this method only if they provide some sort of performance optimization.

Failure modes

An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-NA string. If the n argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to dbGetQuery() with proper n argument succeeds.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
dbGetQuery(con, "SELECT * FROM mtcars")
dbGetQuery(con, "SELECT * FROM mtcars", n = 6)

# Pass values using the param argument:
# (This query runs eight times, once for each different
# parameter. The resulting rows are combined into a single
# data frame.)
dbGetQuery(
  con,
  "SELECT COUNT(*) FROM mtcars WHERE cyl = ?",
  params = list(1:8)
)

dbDisconnect(con)

Execute a data manipulation statement on a given database connection

This section describes the behavior of the following method:

dbSendStatement(conn, statement, ...)

Description

The dbSendStatement() method only submits and synchronously executes the SQL data manipulation statement (e.g., UPDATE, DELETE, �INSERT INTO�, �DROP TABLE�, …) to the database engine. To query the number of affected rows, call dbGetRowsAffected() on the returned result object. You must also call dbClearResult() after that. For interactive use, you should almost always prefer dbExecute().

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbSendStatement() generic (to improve compatibility across backends) but are part of the DBI specification:

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� sections for details on their usage.

Specification

No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to dbClearResult(). Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with dbClearResult().

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

dbSendStatement() comes with a default implementation that simply forwards to dbSendQuery(), to support backends that only implement the latter.

Value

dbSendStatement() returns an S4 object that inherits from DBIResult. The result set can be used with dbGetRowsAffected() to determine the number of rows affected by the query. Once you have finished using a result, make sure to clear it with dbClearResult().

The command execution flow

This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of dbBindArrow(), is implemented by dbExecute(), which should be sufficient for non-parameterized queries. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendStatement() to create a result set object of class DBIResult. For some queries you need to pass immediate = TRUE.

  2. Optionally, bind query parameters withdbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbGetRowsAffected() to retrieve the number of rows affected by the query.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An error is raised when issuing a statement over a closed or invalid connection, or if the statement is not a non-NA string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the params argument) or the immediate argument is set to TRUE.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cars", head(cars, 3))

rs <- dbSendStatement(
  con,
  "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)"
)
dbHasCompleted(rs)
dbGetRowsAffected(rs)
dbClearResult(rs)
dbReadTable(con, "cars")   # there are now 6 rows

# Pass one set of values directly using the param argument:
rs <- dbSendStatement(
  con,
  "INSERT INTO cars (speed, dist) VALUES (?, ?)",
  params = list(4L, 5L)
)
dbClearResult(rs)

# Pass multiple sets of values using dbBind():
rs <- dbSendStatement(
  con,
  "INSERT INTO cars (speed, dist) VALUES (?, ?)"
)
dbBind(rs, list(5:6, 6:7))
dbBind(rs, list(7L, 8L))
dbClearResult(rs)
dbReadTable(con, "cars")   # there are now 10 rows

dbDisconnect(con)

Change database state

This section describes the behavior of the following method:

dbExecute(conn, statement, ...)

Description

Executes a statement and returns the number of rows affected. dbExecute() comes with a default implementation (which should work with most backends) that calls dbSendStatement(), then dbGetRowsAffected(), ensuring that the result is always freed by dbClearResult(). For passing query parameters, see dbBind(), in particular the “The command execution flow� section.

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbExecute() generic (to improve compatibility across backends) but are part of the DBI specification:

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� sections for details on their usage.

Specification

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

You can also use dbExecute() to call a stored procedure that performs data manipulation or other actions that do not return a result set. To execute a stored procedure that returns a result set, or a data manipulation query that also returns a result set such as �INSERT INTO ... RETURNING ...�, use dbGetQuery() instead.

Value

dbExecute() always returns a scalar numeric that specifies the number of rows affected by the statement.

Implementation notes

Subclasses should override this method only if they provide some sort of performance optimization.

Failure modes

An error is raised when issuing a statement over a closed or invalid connection, if the syntax of the statement is invalid, or if the statement is not a non-NA string.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cars", head(cars, 3))
dbReadTable(con, "cars")   # there are 3 rows
dbExecute(
  con,
  "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)"
)
dbReadTable(con, "cars")   # there are now 6 rows

# Pass values using the param argument:
dbExecute(
  con,
  "INSERT INTO cars (speed, dist) VALUES (?, ?)",
  params = list(4:7, 5:8)
)
dbReadTable(con, "cars")   # there are now 10 rows

dbDisconnect(con)

Quote literal strings

This section describes the behavior of the following method:

dbQuoteString(conn, x, ...)

Description

Call this method to generate a string that is suitable for use in a query as a string literal, to make sure that you generate valid SQL and protect against SQL injection attacks.

Arguments

conn A DBIConnection object, as returned by dbConnect().
x A character vector to quote as string.
... Other arguments passed on to methods.

Value

dbQuoteString() returns an object that can be coerced to character, of the same length as the input. For an empty character vector this function returns a length-0 object.

When passing the returned object again to dbQuoteString() as x argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.)

Failure modes

Passing a numeric, integer, logical, or raw vector, or a list for the x argument raises an error.

Specification

The returned expression can be used in a �SELECT ...� query, and for any scalar character x the value of dbGetQuery(paste0("SELECT ", dbQuoteString(x)))[[1]] must be identical to x, even if x contains spaces, tabs, quotes (single or double), backticks, or newlines (in any combination) or is itself the result of a dbQuoteString() call coerced back to character (even repeatedly). If x is NA, the result must merely satisfy is.na(). The strings "NA" or "NULL" are not treated specially.

NA should be translated to an unquoted SQL NULL, so that the query �SELECT * FROM (SELECT 1) a WHERE ... IS NULL� returns one row.

Examples

# Quoting ensures that arbitrary input is safe for use in a query
name <- "Robert'); DROP TABLE Students;--"
dbQuoteString(ANSI(), name)

# NAs become NULL
dbQuoteString(ANSI(), c("x", NA))

# SQL vectors are always passed through as is
var_name <- SQL("select")
var_name
dbQuoteString(ANSI(), var_name)

# This mechanism is used to prevent double escaping
dbQuoteString(ANSI(), dbQuoteString(ANSI(), name))

Quote literal values

This section describes the behavior of the following method:

dbQuoteLiteral(conn, x, ...)

Description

Call these methods to generate a string that is suitable for use in a query as a literal value of the correct type, to make sure that you generate valid SQL and protect against SQL injection attacks.

Arguments

conn A DBIConnection object, as returned by dbConnect().
x A vector to quote as string.
... Other arguments passed on to methods.

Value

dbQuoteLiteral() returns an object that can be coerced to character, of the same length as the input. For an empty integer, numeric, character, logical, date, time, or blob vector, this function returns a length-0 object.

When passing the returned object again to dbQuoteLiteral() as x argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.)

Failure modes

Passing a list for the x argument raises an error.

Specification

The returned expression can be used in a �SELECT ...� query, and the value of dbGetQuery(paste0("SELECT ", dbQuoteLiteral(x)))[[1]] must be equal to x for any scalar integer, numeric, string, and logical. If x is NA, the result must merely satisfy is.na(). The literals "NA" or "NULL" are not treated specially.

NA should be translated to an unquoted SQL NULL, so that the query �SELECT * FROM (SELECT 1) a WHERE ... IS NULL� returns one row.

Examples

# Quoting ensures that arbitrary input is safe for use in a query
name <- "Robert'); DROP TABLE Students;--"
dbQuoteLiteral(ANSI(), name)

# NAs become NULL
dbQuoteLiteral(ANSI(), c(1:3, NA))

# Logicals become integers by default
dbQuoteLiteral(ANSI(), c(TRUE, FALSE, NA))

# Raw vectors become hex strings by default
dbQuoteLiteral(ANSI(), list(as.raw(1:3), NULL))

# SQL vectors are always passed through as is
var_name <- SQL("select")
var_name
dbQuoteLiteral(ANSI(), var_name)

# This mechanism is used to prevent double escaping
dbQuoteLiteral(ANSI(), dbQuoteLiteral(ANSI(), name))

Quote identifiers

This section describes the behavior of the following method:

dbQuoteIdentifier(conn, x, ...)

Description

Call this method to generate a string that is suitable for use in a query as a column or table name, to make sure that you generate valid SQL and protect against SQL injection attacks. The inverse operation is dbUnquoteIdentifier().

Arguments

conn A DBIConnection object, as returned by dbConnect().
x A character vector, SQL or Id object to quote as identifier.
... Other arguments passed on to methods.

Value

dbQuoteIdentifier() returns an object that can be coerced to character, of the same length as the input. For an empty character vector this function returns a length-0 object. The names of the input argument are preserved in the output. When passing the returned object again to dbQuoteIdentifier() as x argument, it is returned unchanged. Passing objects of class SQL should also return them unchanged. (For backends it may be most convenient to return SQL objects to achieve this behavior, but this is not required.)

Failure modes

An error is raised if the input contains NA, but not for an empty string.

Specification

Calling dbGetQuery() for a query of the format �SELECT 1 AS ...� returns a data frame with the identifier, unquoted, as column name. Quoted identifiers can be used as table and column names in SQL queries, in particular in queries like �SELECT 1 AS ...� and �SELECT * FROM (SELECT 1) ...�. The method must use a quoting mechanism that is unambiguously different from the quoting mechanism used for strings, so that a query like �SELECT ... FROM (SELECT 1 AS ...)� throws an error if the column names do not match.

The method can quote column names that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this. In any case, checking the validity of the identifier should be performed only when executing a query, and not by dbQuoteIdentifier().

Examples

# Quoting ensures that arbitrary input is safe for use in a query
name <- "Robert'); DROP TABLE Students;--"
dbQuoteIdentifier(ANSI(), name)

# Use Id() to specify other components such as the schema
id_name <- Id(schema = "schema_name", table = "table_name")
id_name
dbQuoteIdentifier(ANSI(), id_name)

# SQL vectors are always passed through as is
var_name <- SQL("select")
var_name
dbQuoteIdentifier(ANSI(), var_name)

# This mechanism is used to prevent double escaping
dbQuoteIdentifier(ANSI(), dbQuoteIdentifier(ANSI(), name))

Unquote identifiers

This section describes the behavior of the following method:

dbUnquoteIdentifier(conn, x, ...)

Description

Call this method to convert a SQL object created by dbQuoteIdentifier() back to a list of Id objects.

Arguments

conn A DBIConnection object, as returned by dbConnect().
x An SQL or Id object.
... Other arguments passed on to methods.

Value

dbUnquoteIdentifier() returns a list of objects of the same length as the input. For an empty vector, this function returns a length-0 object. The names of the input argument are preserved in the output. If x is a value returned by dbUnquoteIdentifier(), calling dbUnquoteIdentifier(..., dbQuoteIdentifier(..., x)) returns list(x). If x is an object of class Id, calling dbUnquoteIdentifier(..., x) returns list(x). (For backends it may be most convenient to return Id objects to achieve this behavior, but this is not required.)

Plain character vectors can also be passed to dbUnquoteIdentifier().

Failure modes

An error is raised if a character vectors with a missing value is passed as the x argument.

Specification

For any character vector of length one, quoting (with dbQuoteIdentifier()) then unquoting then quoting the first element is identical to just quoting. This is also true for strings that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this.

Unquoting simple strings (consisting of only letters) wrapped with SQL() and then quoting via dbQuoteIdentifier() gives the same result as just quoting the string. Similarly, unquoting expressions of the form SQL("schema.table") and then quoting gives the same result as quoting the identifier constructed by Id("schema", "table").

Examples

# Unquoting allows to understand the structure of a
# possibly complex quoted identifier
dbUnquoteIdentifier(
  ANSI(),
  SQL(c('"Catalog"."Schema"."Table"', '"Schema"."Table"', '"UnqualifiedTable"'))
)

# The returned object is always a list,
# also for Id objects
dbUnquoteIdentifier(ANSI(), Id("Catalog", "Schema", "Table"))

# Quoting and unquoting are inverses
dbQuoteIdentifier(
  ANSI(),
  dbUnquoteIdentifier(ANSI(), SQL("UnqualifiedTable"))[[1]]
)

dbQuoteIdentifier(
  ANSI(),
  dbUnquoteIdentifier(ANSI(), Id("Schema", "Table"))[[1]]
)

Read database tables as data frames

This section describes the behavior of the following method:

dbReadTable(conn, name, ...)

Description

Reads a database table to a data frame, optionally converting a column to row names and converting the column names to valid R identifiers. Use dbReadTableArrow() instead to obtain an Arrow object.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

…

Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbReadTable() generic (to improve compatibility across backends) but are part of the DBI specification:

  • row.names (default: FALSE)

  • check.names

They must be provided as named arguments. See the “Value� section for details on their usage.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbReadTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

Details

This function returns a data frame. Use dbReadTableArrow() to obtain an Arrow object.

Value

dbReadTable() returns a data frame that contains the complete data from the remote table, effectively the result of calling dbGetQuery() with �SELECT * FROM <name>�.

An empty table is returned as a data frame with zero rows.

The presence of rownames depends on the row.names argument, see sqlColumnToRownames() for details:

  • If FALSE or NULL, the returned data frame doesn’t have row names.

  • If TRUE, a column named “row_namesâ€� is converted to row names.

  • If NA, a column named “row_namesâ€� is converted to row names if it exists, otherwise no translation occurs.

  • If a string, this specifies the name of the column in the remote table that contains the row names.

The default is row.names = FALSE.

If the database supports identifiers with special characters, the columns in the returned data frame are converted to valid R identifiers if the check.names argument is TRUE, If check.names = FALSE, the returned table has non-syntactic column names without quotes.

Failure modes

An error is raised if the table does not exist.

An error is raised if row.names is TRUE and no “row_names� column exists,

An error is raised if row.names is set to a string and no corresponding column exists.

An error is raised when calling this method for a closed or invalid connection. An error is raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Unsupported values for row.names and check.names (non-scalars, unsupported data types, NA for check.names) also raise an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars[1:10, ])
dbReadTable(con, "mtcars")

dbDisconnect(con)

Copy data frames to database tables

This section describes the behavior of the following method:

dbWriteTable(conn, name, value, ...)

Description

Writes, overwrites or appends a data frame to a database table, optionally converting row names to a column and specifying SQL data types for fields.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

value

A data.frame (or coercible to data.frame).

…

Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbWriteTable() generic (to improve compatibility across backends) but are part of the DBI specification:

  • row.names (default: FALSE)

  • overwrite (default: FALSE)

  • append (default: FALSE)

  • field.types (default: NULL)

  • temporary (default: FALSE)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbWriteTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

The value argument must be a data frame with a subset of the columns of the existing table if append = TRUE. The order of the columns does not matter with append = TRUE.

If the overwrite argument is TRUE, an existing table of the same name will be overwritten. This argument doesn’t change behavior if the table does not exist yet.

If the append argument is TRUE, the rows in an existing table are preserved, and the new data are appended. If the table doesn’t exist yet, it is created.

If the temporary argument is TRUE, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database.

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names.

The following data types must be supported at least, and be read identically with dbReadTable():

  • integer

  • numeric (the behavior for Inf and NaN is not specified)

  • logical

  • NA as NULL

  • 64-bit values (using "bigint" as field type); the result can be

    • converted to a numeric, which may lose precision,

    • converted a character vector, which gives the full decimal representation

    • written to another table and read again unchanged

  • character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string

  • factor (returned as character)

  • list of raw (if supported by the database)

  • objects of type blob::blob (if supported by the database)

  • date (if supported by the database; returned as Date), also for dates prior to 1970 or 1900 or after 2038

  • time (if supported by the database; returned as objects that inherit from difftime)

  • timestamp (if supported by the database; returned as POSIXct respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone)

Mixing column types in the same table is supported.

The field.types argument must be a named character vector with at most one entry for each column. It indicates the SQL data type to be used for a new column. If a column is missed from field.types, the type is inferred from the input data with dbDataType().

The interpretation of rownames depends on the row.names argument, see sqlRownamesToColumn() for details:

  • If FALSE or NULL, row names are ignored.

  • If TRUE, row names are converted to a column named “row_namesâ€�, even if the input data frame only has natural row names from 1 to nrow(...).

  • If NA, a column named “row_namesâ€� is created if the data has custom row names, no extra column is created in the case of natural row names.

  • If a string, this specifies the name of the column in the remote table that contains the row names, even if the input data frame only has natural row names.

The default is row.names = FALSE.

Details

This function expects a data frame. Use dbWriteTableArrow() to write an Arrow object.

This function is useful if you want to create and load a table at the same time. Use dbAppendTable() or dbAppendTableArrow() for appending data to an existing table, dbCreateTable() or dbCreateTableArrow() for creating a table, and dbExistsTable() and dbRemoveTable() for overwriting tables.

DBI only standardizes writing data frames with dbWriteTable(). Some backends might implement methods that can consume CSV files or other data formats. For details, see the documentation for the individual methods.

Value

dbWriteTable() returns TRUE, invisibly.

Failure modes

If the table exists, and both append and overwrite arguments are unset, or append = TRUE and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Invalid values for the additional arguments row.names, overwrite, append, field.types, and temporary (non-scalars, unsupported data types, NA, incompatible values, duplicate or missing names, incompatible columns) also raise an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars[1:5, ])
dbReadTable(con, "mtcars")

dbWriteTable(con, "mtcars", mtcars[6:10, ], append = TRUE)
dbReadTable(con, "mtcars")

dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE)
dbReadTable(con, "mtcars")

# No row names
dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE, row.names = FALSE)
dbReadTable(con, "mtcars")

Create a table in the database

This section describes the behavior of the following method:

dbCreateTable(conn, name, fields, ..., row.names = NULL, temporary = FALSE)

Description

The default dbCreateTable() method calls sqlCreateTable() and dbExecute(). Use dbCreateTableArrow() to create a table from an Arrow schema.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

fields

Either a character vector or a data frame.

A named character vector: Names are column names, values are types. Names are escaped with dbQuoteIdentifier(). Field types are unescaped.

A data frame: field types are generated using dbDataType().

…

Other parameters passed on to methods.

row.names

Must be NULL.

temporary

If TRUE, will generate a temporary table.

Additional arguments

The following arguments are not part of the dbCreateTable() generic (to improve compatibility across backends) but are part of the DBI specification:

  • temporary (default: FALSE)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbCreateTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

The value argument can be:

  • a data frame,

  • a named list of SQL types

If the temporary argument is TRUE, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database.

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers.

The row.names argument must be missing or NULL, the default value. All other values for the row.names argument (in particular TRUE, NA, and a string) raise an error.

Details

Backends compliant to ANSI SQL 99 don’t need to override it. Backends with a different SQL syntax can override sqlCreateTable(), backends with entirely different ways to create tables need to override this method.

The row.names argument is not supported by this method. Process the values with sqlRownamesToColumn() before calling this method.

The argument order is different from the sqlCreateTable() method, the latter will be adapted in a later release of DBI.

Value

dbCreateTable() returns TRUE, invisibly.

Failure modes

If the table exists, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Invalid values for the row.names and temporary arguments (non-scalars, unsupported data types, NA, incompatible values, duplicate names) also raise an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbCreateTable(con, "iris", iris)
dbReadTable(con, "iris")
dbDisconnect(con)

Insert rows into a table

This section describes the behavior of the following method:

dbAppendTable(conn, name, value, ..., row.names = NULL)

Description

The dbAppendTable() method assumes that the table has been created beforehand, e.g. with dbCreateTable(). The default implementation calls sqlAppendTableTemplate() and then dbExecute() with the param argument. Use dbAppendTableArrow() to append data from an Arrow stream.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

value

A data.frame (or coercible to data.frame).

…

Other parameters passed on to methods.

row.names

Must be NULL.

Details

Backends compliant to ANSI SQL 99 which use �?� as a placeholder for prepared queries don’t need to override it. Backends with a different SQL syntax which use �?� as a placeholder for prepared queries can override sqlAppendTable(). Other backends (with different placeholders or with entirely different ways to create tables) need to override the dbAppendTable() method.

The row.names argument is not supported by this method. Process the values with sqlRownamesToColumn() before calling this method.

Value

dbAppendTable() returns a scalar numeric.

Failure modes

If the table does not exist, or the new data in values is not a data frame or has different column names, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Invalid values for the row.names argument (non-scalars, unsupported data types, NA) also raise an error.

Passing a value argument different to NULL to the row.names argument (in particular TRUE, NA, and a string) raises an error.

Specification

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names.

The following data types must be supported at least, and be read identically with dbReadTable():

  • integer

  • numeric (the behavior for Inf and NaN is not specified)

  • logical

  • NA as NULL

  • 64-bit values (using "bigint" as field type); the result can be

    • converted to a numeric, which may lose precision,

    • converted a character vector, which gives the full decimal representation

    • written to another table and read again unchanged

  • character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings)

  • factor (returned as character, with a warning)

  • list of raw (if supported by the database)

  • objects of type blob::blob (if supported by the database)

  • date (if supported by the database; returned as Date) also for dates prior to 1970 or 1900 or after 2038

  • time (if supported by the database; returned as objects that inherit from difftime)

  • timestamp (if supported by the database; returned as POSIXct respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone)

Mixing column types in the same table is supported.

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbAppendTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done to support databases that allow non-syntactic names for their objects:

The row.names argument must be NULL, the default value. Row names are ignored.

The value argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbCreateTable(con, "iris", iris)
dbAppendTable(con, "iris", iris)
dbReadTable(con, "iris")
dbDisconnect(con)

Remove a table from the database

This section describes the behavior of the following method:

dbRemoveTable(conn, name, ...)

Description

Remove a remote table (e.g., created by dbWriteTable()) from the database.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

…

Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbRemoveTable() generic (to improve compatibility across backends) but are part of the DBI specification:

  • temporary (default: FALSE)

  • fail_if_missing (default: TRUE)

These arguments must be provided as named arguments.

If temporary is TRUE, the call to dbRemoveTable() will consider only temporary tables. Not all backends support this argument. In particular, permanent tables of the same name are left untouched.

If fail_if_missing is FALSE, the call to dbRemoveTable() succeeds if the table does not exist.

Specification

A table removed by dbRemoveTable() doesn’t appear in the list of tables returned by dbListTables(), and dbExistsTable() returns FALSE. The removal propagates immediately to other connections to the same database. This function can also be used to remove a temporary table.

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbRemoveTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

Value

dbRemoveTable() returns TRUE, invisibly.

Failure modes

If the table does not exist, an error is raised. An attempt to remove a view with this function may result in an error.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbExistsTable(con, "iris")
dbWriteTable(con, "iris", iris)
dbExistsTable(con, "iris")
dbRemoveTable(con, "iris")
dbExistsTable(con, "iris")

dbDisconnect(con)

List remote tables

This section describes the behavior of the following method:

dbListTables(conn, ...)

Description

Returns the unquoted names of remote tables accessible through this connection. This should include views and temporary objects, but not all database backends (in particular RMariaDB and RMySQL) support this.

Arguments

conn A DBIConnection object, as returned by dbConnect().
... Other parameters passed on to methods.

Value

dbListTables() returns a character vector that enumerates all tables and views in the database. Tables added with dbWriteTable() are part of the list. As soon a table is removed from the database, it is also removed from the list of database tables.

The same applies to temporary tables if supported by the database.

The returned names are suitable for quoting with dbQuoteIdentifier().

Failure modes

An error is raised when calling this method for a closed or invalid connection.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con)
dbWriteTable(con, "mtcars", mtcars)
dbListTables(con)

dbDisconnect(con)

List field names of a remote table

This section describes the behavior of the following method:

dbListFields(conn, name, ...)

Description

Returns the field names of a remote table as a character vector.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

…

Other parameters passed on to methods.

Value

dbListFields() returns a character vector that enumerates all fields in the table in the correct order. This also works for temporary tables if supported by the database. The returned names are suitable for quoting with dbQuoteIdentifier().

Failure modes

If the table does not exist, an error is raised. Invalid types for the name argument (e.g., character of length not equal to one, or numeric) lead to an error. An error is also raised when calling this method for a closed or invalid connection.

Specification

The name argument can be

  • a string

  • the return value of dbQuoteIdentifier()

  • a value from the table column from the return value of dbListObjects() where is_prefix is FALSE

A column named row_names is treated like any other column.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
dbListFields(con, "mtcars")

dbDisconnect(con)

Does a table exist?

This section describes the behavior of the following method:

dbExistsTable(conn, name, ...)

Description

Returns if a table given by name exists in the database.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

…

Other parameters passed on to methods.

Value

dbExistsTable() returns a logical scalar, TRUE if the table or view specified by the name argument exists, FALSE otherwise.

This includes temporary tables if supported by the database.

Failure modes

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbExistsTable() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

For all tables listed by dbListTables(), dbExistsTable() returns TRUE.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbExistsTable(con, "iris")
dbWriteTable(con, "iris", iris)
dbExistsTable(con, "iris")

dbDisconnect(con)

List remote objects

This section describes the behavior of the following method:

dbListObjects(conn, prefix = NULL, ...)

Description

Returns the names of remote objects accessible through this connection as a data frame. This should include temporary objects, but not all database backends (in particular RMariaDB and RMySQL) support this. Compared to dbListTables(), this method also enumerates tables and views in schemas, and returns fully qualified identifiers to access these objects. This allows exploration of all database objects available to the current user, including those that can only be accessed by giving the full namespace.

Arguments

conn A DBIConnection object, as returned by dbConnect().
prefix A fully qualified path in the database’s namespace, or NULL. This argument will be processed with dbUnquoteIdentifier(). If given the method will return all objects accessible through this prefix.
... Other parameters passed on to methods.

Value

dbListObjects() returns a data frame with columns table and is_prefix (in that order), optionally with other columns with a dot (.) prefix. The table column is of type list. Each object in this list is suitable for use as argument in dbQuoteIdentifier(). The is_prefix column is a logical. This data frame contains one row for each object (schema, table and view) accessible from the prefix (if passed) or from the global namespace (if prefix is omitted). Tables added with dbWriteTable() are part of the data frame. As soon a table is removed from the database, it is also removed from the data frame of database objects.

The same applies to temporary objects if supported by the database.

The returned names are suitable for quoting with dbQuoteIdentifier().

Failure modes

An error is raised when calling this method for a closed or invalid connection.

Specification

The prefix column indicates if the table value refers to a table or a prefix. For a call with the default prefix = NULL, the table values that have is_prefix == FALSE correspond to the tables returned from dbListTables(),

The table object can be quoted with dbQuoteIdentifier(). The result of quoting can be passed to dbUnquoteIdentifier(). (For backends it may be convenient to use the Id class, but this is not required.)

Values in table column that have is_prefix == TRUE can be passed as the prefix argument to another call to dbListObjects(). For the data frame returned from a dbListObject() call with the prefix argument set, all table values where is_prefix is FALSE can be used in a call to dbExistsTable() which returns TRUE.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListObjects(con)
dbWriteTable(con, "mtcars", mtcars)
dbListObjects(con)

dbDisconnect(con)

Is this DBMS object still valid?

This section describes the behavior of the following method:

dbIsValid(dbObj, ...)

Description

This generic tests whether a database object is still valid (i.e. it hasn’t been disconnected or cleared).

Arguments

dbObj An object inheriting from DBIObject, i.e. DBIDriver, DBIConnection, or a DBIResult
... Other arguments to methods.

Value

dbIsValid() returns a logical scalar, TRUE if the object specified by dbObj is valid, FALSE otherwise. A DBIConnection object is initially valid, and becomes invalid after disconnecting with dbDisconnect(). For an invalid connection object (e.g., for some drivers if the object is saved to a file and then restored), the method also returns FALSE. A DBIResult object is valid after a call to dbSendQuery(), and stays valid even after all rows have been fetched; only clearing it with dbClearResult() invalidates it. A DBIResult object is also valid after a call to dbSendStatement(), and stays valid after querying the number of rows affected; only clearing it with dbClearResult() invalidates it. If the connection to the database system is dropped (e.g., due to connectivity problems, server failure, etc.), dbIsValid() should return FALSE. This is not tested automatically.

Examples

dbIsValid(RSQLite::SQLite())

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbIsValid(con)

rs <- dbSendQuery(con, "SELECT 1")
dbIsValid(rs)

dbClearResult(rs)
dbIsValid(rs)

dbDisconnect(con)
dbIsValid(con)

Completion status

This section describes the behavior of the following method:

dbHasCompleted(res, ...)

Description

This method returns if the operation has completed. A SELECT query is completed if all rows have been fetched. A data manipulation statement is always completed.

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbHasCompleted() returns a logical scalar. For a query initiated by dbSendQuery() with non-empty result set, dbHasCompleted() returns FALSE initially and TRUE after calling dbFetch() without limit. For a query initiated by dbSendStatement(), dbHasCompleted() always returns TRUE.

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

Attempting to query completion status for a result set cleared with dbClearResult() gives an error.

Specification

The completion status for a query is only guaranteed to be set to FALSE after attempting to fetch past the end of the entire result. Therefore, for a query with an empty result set, the initial return value is unspecified, but the result value is TRUE after trying to fetch only one row.

Similarly, for a query with a result set of length n, the return value is unspecified after fetching n rows, but the result value is TRUE after trying to fetch only one more row.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQuery(con, "SELECT * FROM mtcars")

dbHasCompleted(rs)
ret1 <- dbFetch(rs, 10)
dbHasCompleted(rs)
ret2 <- dbFetch(rs)
dbHasCompleted(rs)

dbClearResult(rs)
dbDisconnect(con)

Get the statement associated with a result set

This section describes the behavior of the following method:

dbGetStatement(res, ...)

Description

Returns the statement that was passed to dbSendQuery() or dbSendStatement().

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbGetStatement() returns a string, the query used in either dbSendQuery() or dbSendStatement().

Failure modes

Attempting to query the statement for a result set cleared with dbClearResult() gives an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQuery(con, "SELECT * FROM mtcars")
dbGetStatement(rs)

dbClearResult(rs)
dbDisconnect(con)

The number of rows fetched so far

This section describes the behavior of the following method:

dbGetRowCount(res, ...)

Description

Returns the total number of rows actually fetched with calls to dbFetch() for this result set.

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbGetRowCount() returns a scalar number (integer or numeric), the number of rows fetched so far. After calling dbSendQuery(), the row count is initially zero. After a call to dbFetch() without limit, the row count matches the total number of rows returned. Fetching a limited number of rows increases the number of rows by the number of rows returned, even if fetching past the end of the result set. For queries with an empty result set, zero is returned even after fetching. For data manipulation statements issued with dbSendStatement(), zero is returned before and after calling dbFetch().

Failure modes

Attempting to get the row count for a result set cleared with dbClearResult() gives an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQuery(con, "SELECT * FROM mtcars")

dbGetRowCount(rs)
ret1 <- dbFetch(rs, 10)
dbGetRowCount(rs)
ret2 <- dbFetch(rs)
dbGetRowCount(rs)
nrow(ret1) + nrow(ret2)

dbClearResult(rs)
dbDisconnect(con)

The number of rows affected

This section describes the behavior of the following method:

dbGetRowsAffected(res, ...)

Description

This method returns the number of rows that were added, deleted, or updated by a data manipulation statement.

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbGetRowsAffected() returns a scalar number (integer or numeric), the number of rows affected by a data manipulation statement issued with dbSendStatement(). The value is available directly after the call and does not change after calling dbFetch(). NA_integer_ or NA_numeric_ are allowed if the number of rows affected is not known.

For queries issued with dbSendQuery(), zero is returned before and after the call to dbFetch(). NA values are not allowed.

The command execution flow

This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of dbBindArrow(), is implemented by dbExecute(), which should be sufficient for non-parameterized queries. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendStatement() to create a result set object of class DBIResult. For some queries you need to pass immediate = TRUE.

  2. Optionally, bind query parameters withdbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbGetRowsAffected() to retrieve the number of rows affected by the query.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

Attempting to get the rows affected for a result set cleared with dbClearResult() gives an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendStatement(con, "DELETE FROM mtcars")
dbGetRowsAffected(rs)
nrow(mtcars)

dbClearResult(rs)
dbDisconnect(con)

Information about result types

This section describes the behavior of the following method:

dbColumnInfo(res, ...)

Description

Produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame describes an aspect of the result set field (field name, type, etc.)

Arguments

res An object inheriting from DBIResult.
... Other arguments passed on to methods.

Value

dbColumnInfo() returns a data frame with at least two columns "name" and "type" (in that order) (and optional columns that start with a dot). The "name" and "type" columns contain the names and types of the R columns of the data frame that is returned from dbFetch(). The "type" column is of type character and only for information. Do not compute on the "type" column, instead use dbFetch(res, n = 0) to create a zero-row data frame initialized with the correct data types.

The data retrieval flow

This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.

Most of this flow, except repeated calling of dbBind() or dbBindArrow(), is implemented by dbGetQuery(), which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQuery() to create a result set object of class DBIResult.

  2. Optionally, bind query parameters with dbBind() or dbBindArrow(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Optionally, use dbColumnInfo() to retrieve the structure of the result set without retrieving actual data.

  4. Use dbFetch() to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.

  5. Use dbHasCompleted() to tell when you’re done. This method returns TRUE if no more rows are available for fetching.

  6. Repeat the last four steps as necessary.

  7. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An attempt to query columns for a closed result set raises an error.

Specification

A column named row_names is treated like any other column.

The column names are always consistent with the data returned by dbFetch().

If the query returns unnamed columns, non-empty and non-NA names are assigned.

Column names that correspond to SQL or R keywords are left unchanged.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

rs <- dbSendQuery(con, "SELECT 1 AS a, 2 AS b")
dbColumnInfo(rs)
dbFetch(rs)

dbClearResult(rs)
dbDisconnect(con)

Begin/commit/rollback SQL transactions

This section describes the behavior of the following methods:

dbBegin(conn, ...)

dbCommit(conn, ...)

dbRollback(conn, ...)

Description

A transaction encapsulates several SQL statements in an atomic unit. It is initiated with dbBegin() and either made persistent with dbCommit() or undone with dbRollback(). In any case, the DBMS guarantees that either all or none of the statements have a permanent effect. This helps ensuring consistency of write operations to multiple tables.

Arguments

conn A DBIConnection object, as returned by dbConnect().
... Other parameters passed on to methods.

Details

Not all database engines implement transaction management, in which case these methods should not be implemented for the specific DBIConnection subclass.

Value

dbBegin(), dbCommit() and dbRollback() return TRUE, invisibly.

Failure modes

The implementations are expected to raise an error in case of failure, but this is not tested. In any way, all generics throw an error with a closed or invalid connection. In addition, a call to dbCommit() or dbRollback() without a prior call to dbBegin() raises an error. Nested transactions are not supported by DBI, an attempt to call dbBegin() twice yields an error.

Specification

Actual support for transactions may vary between backends. A transaction is initiated by a call to dbBegin() and committed by a call to dbCommit(). Data written in a transaction must persist after the transaction is committed. For example, a record that is missing when the transaction is started but is created during the transaction must exist both during and after the transaction, and also in a new connection.

A transaction can also be aborted with dbRollback(). All data written in such a transaction must be removed after the transaction is rolled back. For example, a record that is missing when the transaction is started but is created during the transaction must not exist anymore after the rollback.

Disconnection from a connection with an open transaction effectively rolls back the transaction. All data written in such a transaction must be removed after the transaction is rolled back.

The behavior is not specified if other arguments are passed to these functions. In particular, RSQLite issues named transactions with support for nesting if the name argument is set.

The transaction isolation level is not specified by DBI.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cash", data.frame(amount = 100))
dbWriteTable(con, "account", data.frame(amount = 2000))

# All operations are carried out as logical unit:
dbBegin(con)
withdrawal <- 300
dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal))
dbCommit(con)

dbReadTable(con, "cash")
dbReadTable(con, "account")

# Rolling back after detecting negative value on account:
dbBegin(con)
withdrawal <- 5000
dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal))
if (dbReadTable(con, "account")\$amount >= 0) {
  dbCommit(con)
} else {
  dbRollback(con)
}

dbReadTable(con, "cash")
dbReadTable(con, "account")

dbDisconnect(con)

Self-contained SQL transactions

This section describes the behavior of the following methods:

dbWithTransaction(conn, code, ...)

dbBreak()

Description

Given that transactions are implemented, this function allows you to pass in code that is run in a transaction. The default method of dbWithTransaction() calls dbBegin() before executing the code, and dbCommit() after successful completion, or dbRollback() in case of an error. The advantage is that you don’t have to remember to do dbBegin() and dbCommit() or dbRollback() – that is all taken care of. The special function dbBreak() allows an early exit with rollback, it can be called only inside dbWithTransaction().

Arguments

conn A DBIConnection object, as returned by dbConnect().
code An arbitrary block of R code.
... Other parameters passed on to methods.

Details

DBI implements dbWithTransaction(), backends should need to override this generic only if they implement specialized handling.

Value

dbWithTransaction() returns the value of the executed code.

Failure modes

Failure to initiate the transaction (e.g., if the connection is closed or invalid or if dbBegin() has been called already) gives an error.

Specification

dbWithTransaction() initiates a transaction with dbBegin(), executes the code given in the code argument, and commits the transaction with dbCommit(). If the code raises an error, the transaction is instead aborted with dbRollback(), and the error is propagated. If the code calls dbBreak(), execution of the code stops and the transaction is silently aborted. All side effects caused by the code (such as the creation of new variables) propagate to the calling environment.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cash", data.frame(amount = 100))
dbWriteTable(con, "account", data.frame(amount = 2000))

# All operations are carried out as logical unit:
dbWithTransaction(
  con,
  {
    withdrawal <- 300
    dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
    dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal))
  }
)

# The code is executed as if in the current environment:
withdrawal

# The changes are committed to the database after successful execution:
dbReadTable(con, "cash")
dbReadTable(con, "account")

# Rolling back with dbBreak():
dbWithTransaction(
  con,
  {
    withdrawal <- 5000
    dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
    dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal))
    if (dbReadTable(con, "account")\$amount < 0) {
      dbBreak()
    }
  }
)

# These changes were not committed to the database:
dbReadTable(con, "cash")
dbReadTable(con, "account")

dbDisconnect(con)

Get DBMS metadata

This section describes the behavior of the following method:

dbGetInfo(dbObj, ...)

Description

Retrieves information on objects of class DBIDriver, DBIConnection or DBIResult.

Arguments

dbObj An object inheriting from DBIObject, i.e. DBIDriver, DBIConnection, or a DBIResult
... Other arguments to methods.

Value

For objects of class DBIDriver, dbGetInfo() returns a named list that contains at least the following components:

  • driver.version: the package version of the DBI backend,

  • client.version: the version of the DBMS client library.

For objects of class DBIConnection, dbGetInfo() returns a named list that contains at least the following components:

  • db.version: version of the database server,

  • dbname: database name,

  • username: username to connect to the database,

  • host: hostname of the database server,

  • port: port on the database server. It must not contain a password component. Components that are not applicable should be set to NA.

For objects of class DBIResult, dbGetInfo() returns a named list that contains at least the following components:

  • statatment: the statement used with dbSendQuery() or dbExecute(), as returned by dbGetStatement(),

  • row.count: the number of rows fetched so far (for queries), as returned by dbGetRowCount(),

  • rows.affected: the number of rows affected (for statements), as returned by dbGetRowsAffected()

  • has.completed: a logical that indicates if the query or statement has completed, as returned by dbHasCompleted().

Implementation notes

The default implementation for �DBIResult objects� constructs such a list from the return values of the corresponding methods, dbGetStatement(), dbGetRowCount(), dbGetRowsAffected(), and dbHasCompleted().

Examples

dbGetInfo(RSQLite::SQLite())

Execute a query on a given database connection for retrieval via Arrow

This section describes the behavior of the following method:

dbSendQueryArrow(conn, statement, ...)

Description

Experimental

The dbSendQueryArrow() method only submits and synchronously executes the SQL query to the database engine. It does not extract any records — for that you need to use the dbFetchArrow() method, and then you must call dbClearResult() when you finish fetching the records you need. For interactive use, you should almost always prefer dbGetQueryArrow(). Use dbSendQuery() or dbGetQuery() instead to retrieve the results as a data frame.

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbSendQueryArrow() generic (to improve compatibility across backends) but are part of the DBI specification:

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� sections for details on their usage.

Specification

No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to dbClearResult(). Failure to clear the result set leads to a warning when the connection is closed.

If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with dbClearResult().

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

This method is for SELECT queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use dbSendStatement() for data manipulation statements.

Value

dbSendQueryArrow() returns an S4 object that inherits from DBIResultArrow. The result set can be used with dbFetchArrow() to extract records. Once you have finished using a result, make sure to clear it with dbClearResult().

The data retrieval flow for Arrow streams

This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream.

Most of this flow, except repeated calling of dbBindArrow() or dbBind(), is implemented by dbGetQueryArrow(), which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQueryArrow() to create a result set object of class DBIResultArrow.

  2. Optionally, bind query parameters with dbBindArrow() or dbBind(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Use dbFetchArrow() to get a data stream.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-NA string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the params argument) or the immediate argument is set to TRUE.

Examples

# Retrieve data as arrow table
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetchArrow(rs)
dbClearResult(rs)

dbDisconnect(con)

Fetch records from a previously executed query as an Arrow object

This section describes the behavior of the following method:

dbFetchArrow(res, ...)

Description

Experimental

Fetch the result set and return it as an Arrow object. Use dbFetchArrowChunk() to fetch results in chunks.

Arguments

res An object inheriting from DBIResultArrow, created by dbSendQueryArrow().
... Other arguments passed on to methods.

Value

dbFetchArrow() always returns an object coercible to a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows.

The data retrieval flow for Arrow streams

This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream.

Most of this flow, except repeated calling of dbBindArrow() or dbBind(), is implemented by dbGetQueryArrow(), which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQueryArrow() to create a result set object of class DBIResultArrow.

  2. Optionally, bind query parameters with dbBindArrow() or dbBind(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Use dbFetchArrow() to get a data stream.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An attempt to fetch from a closed result set raises an error.

Specification

Fetching multi-row queries with one or more columns by default returns the entire result. The object returned by dbFetchArrow() can also be passed to nanoarrow::as_nanoarrow_array_stream() to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)

# Fetch all results
rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4")
as.data.frame(dbFetchArrow(rs))
dbClearResult(rs)

dbDisconnect(con)

Fetch the next batch of records from a previously executed query as an Arrow object

This section describes the behavior of the following method:

dbFetchArrowChunk(res, ...)

Description

Experimental

Fetch the next chunk of the result set and return it as an Arrow object. The chunk size is implementation-specific. Use dbFetchArrow() to fetch all results.

Arguments

res An object inheriting from DBIResultArrow, created by dbSendQueryArrow().
... Other arguments passed on to methods.

Value

dbFetchArrowChunk() always returns an object coercible to a data.frame with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows.

The data retrieval flow for Arrow streams

This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream.

Most of this flow, except repeated calling of dbBindArrow() or dbBind(), is implemented by dbGetQueryArrow(), which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by dbConnect(). See also vignette("dbi-advanced") for a walkthrough.

  1. Use dbSendQueryArrow() to create a result set object of class DBIResultArrow.

  2. Optionally, bind query parameters with dbBindArrow() or dbBind(). This is required only if the query contains placeholders such as �?� or �\$1�, depending on the database backend.

  3. Use dbFetchArrow() to get a data stream.

  4. Repeat the last two steps as necessary.

  5. Use dbClearResult() to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use on.exit() or withr::defer() to ensure that this step is always executed.

Failure modes

An attempt to fetch from a closed result set raises an error.

Specification

Fetching multi-row queries with one or more columns returns the next chunk. The size of the chunk is implementation-specific. The object returned by dbFetchArrowChunk() can also be passed to nanoarrow::as_nanoarrow_array() to create a nanoarrow array object. The chunk size is implementation-specific.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)

# Fetch all results
rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbHasCompleted(rs)
as.data.frame(dbFetchArrowChunk(rs))
dbHasCompleted(rs)
as.data.frame(dbFetchArrowChunk(rs))
dbClearResult(rs)

dbDisconnect(con)

Retrieve results from a query as an Arrow object

This section describes the behavior of the following method:

dbGetQueryArrow(conn, statement, ...)

Description

Experimental

Returns the result of a query as an Arrow object. dbGetQueryArrow() comes with a default implementation (which should work with most backends) that calls dbSendQueryArrow(), then dbFetchArrow(), ensuring that the result is always freed by dbClearResult(). For passing query parameters, see dbSendQueryArrow(), in particular the “The data retrieval flow for Arrow streams� section. For retrieving results as a data frame, see dbGetQuery().

Arguments

conn A DBIConnection object, as returned by dbConnect().
statement a character string containing SQL.
... Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbGetQueryArrow() generic (to improve compatibility across backends) but are part of the DBI specification:

  • params (default: NULL)

  • immediate (default: NULL)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

The param argument allows passing query parameters, see dbBind() for details.

Specification for the immediate argument

The immediate argument supports distinguishing between “direct� and “prepared� APIs offered by many database drivers. Passing immediate = TRUE leads to immediate execution of the query or statement, via the “direct� API (if supported by the driver). The default NULL means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct immediate argument. Examples for possible behaviors:

  1. DBI backend defaults to immediate = TRUE internally

    1. A query without parameters is passed: query is executed

    2. A query with parameters is passed:

      1. params not given: rejected immediately by the database because of a syntax error in the query, the backend tries immediate = FALSE (and gives a message)

      2. params given: query is executed using immediate = FALSE

  2. DBI backend defaults to immediate = FALSE internally

    1. A query without parameters is passed:

      1. simple query: query is executed

      2. “special� query (such as setting a config options): fails, the backend tries immediate = TRUE (and gives a message)

    2. A query with parameters is passed:

      1. params not given: waiting for parameters via dbBind()

      2. params given: query is executed

Details

This method is for SELECT queries only (incl. other SQL statements that return a SELECT-alike result, e.g., execution of a stored procedure or data manipulation queries like �INSERT INTO ... RETURNING ...�). To execute a stored procedure that does not return a result set, use dbExecute().

Some backends may support data manipulation statements through this method. However, callers are strongly advised to use dbExecute() for data manipulation statements.

Value

dbGetQueryArrow() always returns an object coercible to a data.frame, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows.

Implementation notes

Subclasses should override this method only if they provide some sort of performance optimization.

Failure modes

An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-NA string. The object returned by dbGetQueryArrow() can also be passed to nanoarrow::as_nanoarrow_array_stream() to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific.

Examples

# Retrieve data as arrow table
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)
dbGetQueryArrow(con, "SELECT * FROM mtcars")

dbDisconnect(con)

Read database tables as Arrow objects

This section describes the behavior of the following method:

dbReadTableArrow(conn, name, ...)

Description

Experimental

Reads a database table as an Arrow object. Use dbReadTable() instead to obtain a data frame.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

…

Other parameters passed on to methods.

Details

This function returns an Arrow object. Convert it to a data frame with as.data.frame() or use dbReadTable() to obtain a data frame.

Value

dbReadTableArrow() returns an Arrow object that contains the complete data from the remote table, effectively the result of calling dbGetQueryArrow() with �SELECT * FROM <name>�.

An empty table is returned as an Arrow object with zero rows.

Failure modes

An error is raised if the table does not exist.

An error is raised when calling this method for a closed or invalid connection. An error is raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbReadTableArrow() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

Examples

# Read data as Arrow table
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars[1:10, ])
dbReadTableArrow(con, "mtcars")

dbDisconnect(con)

Copy Arrow objects to database tables

This section describes the behavior of the following method:

dbWriteTableArrow(conn, name, value, ...)

Description

Experimental

Writes, overwrites or appends an Arrow object to a database table.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

value

An nanoarray stream, or an object coercible to a nanoarray stream with nanoarrow::as_nanoarrow_array_stream().

…

Other parameters passed on to methods.

Additional arguments

The following arguments are not part of the dbWriteTableArrow() generic (to improve compatibility across backends) but are part of the DBI specification:

  • overwrite (default: FALSE)

  • append (default: FALSE)

  • temporary (default: FALSE)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbWriteTableArrow() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

The value argument must be a data frame with a subset of the columns of the existing table if append = TRUE. The order of the columns does not matter with append = TRUE.

If the overwrite argument is TRUE, an existing table of the same name will be overwritten. This argument doesn’t change behavior if the table does not exist yet.

If the append argument is TRUE, the rows in an existing table are preserved, and the new data are appended. If the table doesn’t exist yet, it is created.

If the temporary argument is TRUE, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database.

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names.

The following data types must be supported at least, and be read identically with dbReadTable():

  • integer

  • numeric (the behavior for Inf and NaN is not specified)

  • logical

  • NA as NULL

  • 64-bit values (using "bigint" as field type); the result can be

    • converted to a numeric, which may lose precision,

    • converted a character vector, which gives the full decimal representation

    • written to another table and read again unchanged

  • character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string

  • factor (possibly returned as character)

  • objects of type blob::blob (if supported by the database)

  • date (if supported by the database; returned as Date), also for dates prior to 1970 or 1900 or after 2038

  • time (if supported by the database; returned as objects that inherit from difftime)

  • timestamp (if supported by the database; returned as POSIXct respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone)

Mixing column types in the same table is supported.

Details

This function expects an Arrow object. Convert a data frame to an Arrow object with nanoarrow::as_nanoarrow_array_stream() or use dbWriteTable() to write a data frame.

This function is useful if you want to create and load a table at the same time. Use dbAppendTableArrow() for appending data to an existing table, dbCreateTableArrow() for creating a table and specifying field types, and dbRemoveTable() for overwriting tables.

Value

dbWriteTableArrow() returns TRUE, invisibly.

Failure modes

If the table exists, and both append and overwrite arguments are unset, or append = TRUE and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Invalid values for the additional arguments overwrite, append, and temporary (non-scalars, unsupported data types, NA, incompatible values, incompatible columns) also raise an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTableArrow(con, "mtcars", nanoarrow::as_nanoarrow_array_stream(mtcars[1:5, ]))
dbReadTable(con, "mtcars")

dbDisconnect(con)

Create a table in the database based on an Arrow object

This section describes the behavior of the following method:

dbCreateTableArrow(conn, name, value, ..., temporary = FALSE)

Description

Experimental

The default dbCreateTableArrow() method determines the R data types of the Arrow schema associated with the Arrow object, and calls dbCreateTable(). Backends that implement dbAppendTableArrow() should typically also implement this generic. Use dbCreateTable() to create a table from the column types as defined in a data frame.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

value

An object for which a schema can be determined via nanoarrow::infer_nanoarrow_schema().

…

Other parameters passed on to methods.

temporary

If TRUE, will generate a temporary table.

Additional arguments

The following arguments are not part of the dbCreateTableArrow() generic (to improve compatibility across backends) but are part of the DBI specification:

  • temporary (default: FALSE)

They must be provided as named arguments. See the “Specification� and “Value� sections for details on their usage.

Specification

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbCreateTableArrow() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done

The value argument can be:

  • a data frame,

  • a nanoarrow array

  • a nanoarrow array stream (which will still contain the data after the call)

  • a nanoarrow schema

If the temporary argument is TRUE, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database.

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers.

Value

dbCreateTableArrow() returns TRUE, invisibly.

Failure modes

If the table exists, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar. Invalid values for the temporary argument (non-scalars, unsupported data types, NA, incompatible values, duplicate names) also raise an error.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")
ptype <- data.frame(a = numeric())
dbCreateTableArrow(con, "df", nanoarrow::infer_nanoarrow_schema(ptype))
dbReadTable(con, "df")
dbDisconnect(con)

Insert rows into a table from an Arrow stream

This section describes the behavior of the following method:

dbAppendTableArrow(conn, name, value, ...)

Description

Experimental

The dbAppendTableArrow() method assumes that the table has been created beforehand, e.g. with dbCreateTableArrow(). The default implementation calls dbAppendTable() for each chunk of the stream. Use dbAppendTable() to append data from a data.frame.

Arguments

conn

A DBIConnection object, as returned by dbConnect().

name

The table name, passed on to dbQuoteIdentifier(). Options are:

  • a character string with the unquoted DBMS table name, e.g. “table_nameâ€�,

  • a call to Id() with components to the fully qualified table name, e.g. Id(schema = “my_schemaâ€�, table = “table_nameâ€�)

  • a call to SQL() with the quoted and fully qualified table name given verbatim, e.g. SQL(‘“my_schemaâ€�.â€�table_nameâ€�’)

value

An object coercible with nanoarrow::as_nanoarrow_array_stream().

…

Other parameters passed on to methods.

Value

dbAppendTableArrow() returns a scalar numeric.

Failure modes

If the table does not exist, or the new data in values is not a data frame or has different column names, an error is raised; the remote table remains unchanged.

An error is raised when calling this method for a closed or invalid connection. An error is also raised if name cannot be processed with dbQuoteIdentifier() or if this results in a non-scalar.

Specification

SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names.

The following data types must be supported at least, and be read identically with dbReadTable():

  • integer

  • numeric (the behavior for Inf and NaN is not specified)

  • logical

  • NA as NULL

  • 64-bit values (using "bigint" as field type); the result can be

    • converted to a numeric, which may lose precision,

    • converted a character vector, which gives the full decimal representation

    • written to another table and read again unchanged

  • character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings)

  • factor (possibly returned as character)

  • objects of type blob::blob (if supported by the database)

  • date (if supported by the database; returned as Date) also for dates prior to 1970 or 1900 or after 2038

  • time (if supported by the database; returned as objects that inherit from difftime)

  • timestamp (if supported by the database; returned as POSIXct respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone)

Mixing column types in the same table is supported.

The name argument is processed as follows, to support databases that allow non-syntactic names for their objects:

  • If an unquoted table name as string: dbAppendTableArrow() will do the quoting, perhaps by calling dbQuoteIdentifier(conn, x = name)

  • If the result of a call to dbQuoteIdentifier(): no more quoting is done to support databases that allow non-syntactic names for their objects:

The value argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter.

Examples

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbCreateTableArrow(con, "iris", iris[0, ])
dbAppendTableArrow(con, "iris", iris[1:5, ])
dbReadTable(con, "iris")
dbDisconnect(con)
DBI/inst/doc/spec.R0000644000176200001440000000022315147357127013460 0ustar liggesusers## ----echo = FALSE------------------------------------------------------------- knitr::asis_output(paste(readLines("spec.md"), collapse = "\n")) DBI/inst/doc/spec.Rmd0000644000176200001440000000177114607456777014025 0ustar liggesusers--- title: "DBI specification" author: "Kirill Müller" output: rmarkdown::html_vignette abstract: > The DBI package defines the generic DataBase Interface for R. The connection to individual DBMS is provided by other packages that import DBI (so-called *DBI backends*). This document formalizes the behavior expected by the methods declared in DBI and implemented by the individual backends. To ensure maximum portability and exchangeability, and to reduce the effort for implementing a new DBI backend, the DBItest package defines a comprehensive set of test cases that test conformance to the DBI specification. This document is derived from comments in the test definitions of the DBItest package. Any extensions or updates to the tests will be reflected in this document. vignette: > %\VignetteIndexEntry{DBI specification} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo = FALSE} knitr::asis_output(paste(readLines("spec.md"), collapse = "\n")) ``` DBI/inst/doc/DBI-history.html0000644000176200001440000002332515147357123015372 0ustar liggesusers History of DBI

History of DBI

David James

The following history of DBI was contributed by David James, the driving force behind the development of DBI, and many of the packages that implement it.

The idea/work of interfacing S (originally S3 and S4) to RDBMS goes back to the mid- and late 1990’s in Bell Labs. The first toy interface I did was to implement John Chamber’s early concept of “Data Management in S� (1991). The implementation followed that interface pretty closely and immediately showed some of the limitations when dealing with very large databases; if my memory serves me, the issue was the instance-based of the language back then, e.g., if you attached an RDBMS to the search() path and then needed to resolve a symbol “foo�, you effectively had to bring all the objects in the database to check their mode/class, i.e., the instance object had the metadata in itself as attributes. The experiment showed that the S3 implementation of “data management� was not really suitable to large external RDBMS (probably it was never intended to do that anyway). (Note however, that since then, John and Duncan Temple Lang generalized the data management in S4 a lot, including Duncan’s implementation in his RObjectTables package where he considered a lot of synchronization/caching issues relevant to DBI and, more generally, to most external interfaces).

Back then we were working very closely with Lucent’s microelectronics manufacturing — our colleagues there had huge Oracle (mostly) databases that we needed to constantly query via SQL*Plus. My colleague Jake Luciani was developing advanced applications in C and SQL, and the two of us came up with the first implementation of S3 directly connecting with Oracle. What I remember is that the Linux PRO*C pre-compiler (that embedded SQL in C code) was very buggy — we spent a lot of time looking for workarounds and tricks until we got the C interface running. At the time, other projects within Bell Labs began using MySQL, and we moved to MySQL (with the help of Doug Bates’ student Saikat DebRoy, then a summer intern) with no intentions of looking back at the very difficult Oracle interface. It was at this time that I moved all the code from S3 methods to S4 classes and methods and begun reaching out to the S/R community for suggestions, ideas, etc. All (most) of this work was on Bell Labs versions of S3 and S4, but I made sure it worked with S-Plus. At some point around 2000 (I don’t remember exactly when), I ported all the code to R regressing to S3 methods, and later on (once S4 classes and methods were available in R) I re-implemented everything back to S4 classes and methods in R (a painful back-and-forth). It was at this point that I decided to drop S-Plus altogether. Around that time, I came across a very early implementation of SQLite and I was quite interested and thought it was a very nice RDBMS that could be used for all kinds of experimentation, etc., so it was pretty easy to implement on top of the DBI.

Within the R community, there were quite a number of people that showed interest on defining a common interface to databases, but only a few folks actually provided code/suggestions/etc. (Tim Keitt was most active with the dbi/PostgreSQL packages — he also was considering what he called “proxy� objects, which was reminiscent of what Duncan had been doing). Kurt Hornick, Vincent Carey, Robert Gentleman, and others provided suggestions/comments/support for the DBI definition. By around 2003, the DBI was more or less implemented as it is today.

I’m sure I’ll forget some (most should be in the THANKS sections of the various packages), but the names that come to my mind at this moment are Jake Luciani (ROracle), Don MacQueen and other early ROracle users (super helpful), Doug Bates and his student Saikat DebRoy for RMySQL, Fei Chen (at the time a student of Prof. Ripley) also contributed to RMySQL, Tim Keitt (working on an early S3 interface to PostgrSQL), Torsten Hothorn (worked with mSQL and also MySQL), Prof. Ripley working/extending the RODBC package, in addition to John Chambers and Duncan Temple-Lang who provided very important comments and suggestions.

Actually, the real impetus behind the DBI was always to do distributed statistical computing — not to provide a yet-another import/export mechanism — and this perspective was driven by John and Duncan’s vision and work on inter-system computing, COM, CORBA, etc. I’m not sure many of us really appreciated (even now) the full extent of those ideas and concepts. Just like in other languages (C’s ODBC, Java’s JDBC, Perl’s DBI/DBD, Python dbapi), R/S DBI was meant to unify the interfacing to RDBMS so that R/S applications could be developed on top of the DBI and not be hard coded to any one relation database. The interface I tried to follow the closest was the Python’s DBAPI — I haven’t worked on this topic for a while, but I still feel Python’s DBAPI is the cleanest and most relevant for the S language.

DBI/inst/doc/DBI-advanced.R0000644000176200001440000001231115147357120014661 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- library(knitr) opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) knit_print.data.frame <- function(x, ...) { print(head(x, 3)) if (nrow(x) > 3) { cat("Showing 3 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ## ----------------------------------------------------------------------------- library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = 'G'") df <- dbFetch(res, n = 3) dbClearResult(res) head(df, 3) ## ----------------------------------------------------------------------------- res <- dbSendQuery(con, "SELECT * FROM film") while (!dbHasCompleted(res)) { chunk <- dbFetch(res, n = 300) print(nrow(chunk)) } dbClearResult(res) ## ----quote-------------------------------------------------------------------- safe_id <- dbQuoteIdentifier(con, "rating") safe_param <- dbQuoteLiteral(con, "G") query <- paste0("SELECT title, ", safe_id, " FROM film WHERE ", safe_id, " = ", safe_param) query res <- dbSendQuery(con, query) dbFetch(res) dbClearResult(res) ## ----------------------------------------------------------------------------- id <- "rating" param <- "G" query <- glue::glue_sql("SELECT title, {`id`} FROM film WHERE {`id`} = {param}", .con = con) df <- dbGetQuery(con, query) head(df, 3) ## ----params------------------------------------------------------------------- params <- list("G") safe_id <- dbQuoteIdentifier(con, "rating") query <- paste0("SELECT * FROM film WHERE ", safe_id, " = ?") query res <- dbSendQuery(con, query, params = params) dbFetch(res, n = 3) dbClearResult(res) ## ----multi-param-------------------------------------------------------------- q_params <- list("G", 90) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ## ----dbbind------------------------------------------------------------------- res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list("G")) dbFetch(res, n = 3) dbBind(res, list("PG")) dbFetch(res, n = 3) dbClearResult(res) ## ----bind_quotestring--------------------------------------------------------- res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list(c("G", "PG"))) dbFetch(res, n = 3) dbClearResult(res) ## ----bind-multi-param--------------------------------------------------------- q_params <- list(c("G", "PG"), c(90, 120)) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ## ----disconnect--------------------------------------------------------------- dbDisconnect(con) ## ----------------------------------------------------------------------------- library(DBI) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (4, 4), (5, 5), (6, 6)" ) dbGetRowsAffected(rs) dbClearResult(rs) dbReadTable(con, "cars") ## ----------------------------------------------------------------------------- dbDisconnect(con) ## ----------------------------------------------------------------------------- con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) withdraw <- function(amount) { # All operations must be carried out as logical unit: dbExecute(con, "UPDATE cash SET amount = amount + ?", list(amount)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(amount)) } withdraw_transacted <- function(amount) { # Ensure atomicity dbBegin(con) # Perform operation withdraw(amount) # Persist results dbCommit(con) } withdraw_transacted(300) ## ----------------------------------------------------------------------------- dbReadTable(con, "cash") dbReadTable(con, "account") ## ----------------------------------------------------------------------------- withdraw_if_funds <- function(amount) { dbBegin(con) withdraw(amount) # Rolling back after detecting negative value on account: if (dbReadTable(con, "account")$amount >= 0) { dbCommit(con) TRUE } else { message("Insufficient funds") dbRollback(con) FALSE } } withdraw_if_funds(5000) dbReadTable(con, "cash") dbReadTable(con, "account") ## ----error = TRUE------------------------------------------------------------- try({ withdraw_safely <- function(amount) { dbWithTransaction(con, { withdraw(amount) if (dbReadTable(con, "account")$amount < 0) { stop("Error: insufficient funds", call. = FALSE) } }) } withdraw_safely(5000) dbReadTable(con, "cash") dbReadTable(con, "account") }) ## ----------------------------------------------------------------------------- dbDisconnect(con) DBI/inst/doc/DBI-arrow.R0000644000176200001440000000547115147357122014261 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- library(knitr) opts_chunk$set(echo = TRUE) knitr::opts_chunk$set(error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5")) knit_print.data.frame <- function(x, ...) { print(head(x, 6)) if (nrow(x) > 6) { cat("Showing 6 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ## ----------------------------------------------------------------------------- library(DBI) con <- dbConnect(RSQLite::SQLite()) data <- data.frame( a = 1:3, b = 4.5, c = "five" ) dbWriteTable(con, "tbl", data) ## ----------------------------------------------------------------------------- stream <- dbReadTableArrow(con, "tbl") stream as.data.frame(stream) ## ----------------------------------------------------------------------------- stream <- dbGetQueryArrow(con, "SELECT COUNT(*) AS n FROM tbl WHERE a < 3") stream path <- tempfile(fileext = ".parquet") arrow::write_parquet(arrow::as_record_batch_reader(stream), path) arrow::read_parquet(path) ## ----------------------------------------------------------------------------- params <- data.frame(a = 3L) stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) params <- data.frame(a = c(2L, 4L)) # Equivalent to dbBind() stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params) as.data.frame(stream) ## ----------------------------------------------------------------------------- rs <- dbSendQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a") in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 2L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 3L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1:4L)) dbBindArrow(rs, in_arrow) as.data.frame(dbFetchArrow(rs)) dbClearResult(rs) ## ----------------------------------------------------------------------------- stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbWriteTableArrow(con, "tbl_new", stream) dbReadTable(con, "tbl_new") ## ----------------------------------------------------------------------------- stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3") dbCreateTableArrow(con, "tbl_split", stream) dbAppendTableArrow(con, "tbl_split", stream) stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a >= 3") dbAppendTableArrow(con, "tbl_split", stream) dbReadTable(con, "tbl_split") ## ----------------------------------------------------------------------------- dbDisconnect(con) DBI/inst/doc/DBI-advanced.Rmd0000644000176200001440000002655715143057347015227 0ustar liggesusers--- title: "Advanced DBI Usage" author: "James Wondrasek, Kirill Müller" date: "17/03/2020" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Advanced DBI Usage} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} library(knitr) opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) knit_print.data.frame <- function(x, ...) { print(head(x, 3)) if (nrow(x) > 3) { cat("Showing 3 out of", nrow(x), "rows.\n") } invisible(x) } registerS3method("knit_print", "data.frame", "knit_print.data.frame") ``` ## Who this tutorial is for This tutorial is for you if you need to use a richer set of SQL features such as data manipulation queries, parameterized queries and queries performed using SQL's transaction features. See `vignette("DBI", package = "DBI")` for a more basic tutorial covering connecting to DBMS and executing simple queries. ## How to run more complex queries using DBI `dbGetQuery()` works by calling a number of functions behind the scenes. If you need more control you can manually build your own query, retrieve results at your selected rate, and release the resources involved by calling the same functions. These functions are: - `dbSendQuery()` sends the SQL query to the DBMS and returns a `result` object. The query is limited to `SELECT` statements. If you want to send other statements, such as `INSERT`, `UPDATE`, `DELETE`, etc, use `dbSendStatement()`. - `dbFetch()` is called with the `result` object returned by `dbSendQuery()`. It also accepts an argument specifying the number of rows to be returned, e.g. `n = 200`. If you want to fetch all the rows, use `n = -1`. - `dbClearResult()` is called when you have finished retrieving data. It releases the resources associated with the `result` object. ```{r} library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = 'G'") df <- dbFetch(res, n = 3) dbClearResult(res) head(df, 3) ``` ## How to read part of a table from a database If your dataset is large you may want to fetch a limited number of rows at a time. As demonstrated below, this can be accomplished by using a while loop where the function `dbHasCompleted()` is used to check for ongoing rows, and `dbFetch()` is used with the `n = X` argument, specifying how many rows to return on each iteration. Again, we call `dbClearResult()` at the end to release resources. ```{r} res <- dbSendQuery(con, "SELECT * FROM film") while (!dbHasCompleted(res)) { chunk <- dbFetch(res, n = 300) print(nrow(chunk)) } dbClearResult(res) ``` ## How to use parameters (safely) in SQL queries `dbSendQuery()` can be used with parameterized SQL queries. DBI supports two ways to avoid SQL injection attacks from user-supplied parameters: quoting and parameterized queries. ### Quoting Quoting of parameter values is performed using the function `dbQuoteLiteral()`, which supports many R data types, including date and time.[^quote-string] [^quote-string]: An older method, `dbQuoteString()`, was used to quote string values only. The `dbQuoteLiteral()` method forwards to `dbQuoteString()` for character vectors. Users do not need to distinguish between these two cases. In cases where users may be supplying table or column names to use in the query for data retrieval, those names or identifiers must also be escaped. As there may be DBMS-specific rules for escaping these identifiers, DBI provides the function `dbQuoteIdentifier()` to generate a safe string representation. ```{r quote} safe_id <- dbQuoteIdentifier(con, "rating") safe_param <- dbQuoteLiteral(con, "G") query <- paste0("SELECT title, ", safe_id, " FROM film WHERE ", safe_id, " = ", safe_param) query res <- dbSendQuery(con, query) dbFetch(res) dbClearResult(res) ``` The same result can be had by using `glue::glue_sql()`. It performs the same safe quoting on any variable or R statement appearing between braces within the query string. ```{r} id <- "rating" param <- "G" query <- glue::glue_sql("SELECT title, {`id`} FROM film WHERE {`id`} = {param}", .con = con) df <- dbGetQuery(con, query) head(df, 3) ``` ### Parameterized queries Rather than performing the parameter substitution ourselves, we can push it to the DBMS by including placeholders in the query. Different DBMS use different placeholder schemes, DBI passes through the SQL expression unchanged. MariaDB uses a question mark (?) as placeholder and expects an unnamed list of parameter values. Other DBMS may use named parameters. We recommend consulting the documentation for the DBMS you are using. As an example, a web search for "mariadb parameterized queries" leads to the documentation for the [`PREPARE` statement](https://mariadb.com/docs/server/reference/sql-statements/prepared-statements/prepare-statement) which mentions: > Within the statement, "?" characters can be used as parameter markers to indicate where data values are to be bound to the query later when you execute it. Currently there is no list of which placeholder scheme a particular DBMS supports. Placeholders only work for literal values. Other parts of the query, e.g. table or column identifiers, still need to be quoted with `dbQuoteIdentifier()`. For a single set of parameters, the `params` argument to `dbSendQuery()` or `dbGetQuery()` can be used. It takes a list and its members are substituted in order for the placeholders within the query. ```{r params} params <- list("G") safe_id <- dbQuoteIdentifier(con, "rating") query <- paste0("SELECT * FROM film WHERE ", safe_id, " = ?") query res <- dbSendQuery(con, query, params = params) dbFetch(res, n = 3) dbClearResult(res) ``` Below is an example query using multiple placeholders with the MariaDB driver. The placeholders are supplied as a list of values ordered to match the position of the placeholders in the query. ```{r multi-param} q_params <- list("G", 90) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ``` When you wish to perform the same query with different sets of parameter values, `dbBind()` is used. There are two ways to use `dbBind()`. Firstly, it can be used multiple times with same query. ```{r dbbind} res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list("G")) dbFetch(res, n = 3) dbBind(res, list("PG")) dbFetch(res, n = 3) dbClearResult(res) ``` Secondly, `dbBind()` can be used to execute the same statement with multiple values at once. ```{r bind_quotestring} res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?") dbBind(res, list(c("G", "PG"))) dbFetch(res, n = 3) dbClearResult(res) ``` Use a list of vectors if your query has multiple parameters: ```{r bind-multi-param} q_params <- list(c("G", "PG"), c(90, 120)) query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?" res <- dbSendQuery(con, query, params = q_params) dbFetch(res, n = 3) dbClearResult(res) ``` Always disconnect from the database when done. ```{r disconnect} dbDisconnect(con) ``` ## SQL data manipulation - UPDATE, DELETE and friends For SQL queries that affect the underlying database, such as UPDATE, DELETE, INSERT INTO, and DROP TABLE, DBI provides two functions. `dbExecute()` passes the SQL statement to the DBMS for execution and returns the number of rows affected. `dbSendStatement()` performs in the same manner, but returns a result object. Call `dbGetRowsAffected()` with the result object to get the count of the affected rows. You then need to call `dbClearResult()` with the result object afterwards to release resources. In actuality, `dbExecute()` is a convenience function that calls `dbSendStatement()`, `dbGetRowsAffected()`, and `dbClearResult()`. You can use these functions if you need more control over the query process. The subsequent examples use an in-memory SQL database provided by `RSQLite::SQLite()`, because the remote database used in above examples does not allow writing. ```{r} library(DBI) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (4, 4), (5, 5), (6, 6)" ) dbGetRowsAffected(rs) dbClearResult(rs) dbReadTable(con, "cars") ``` Do not forget to disconnect from the database at the end. ```{r} dbDisconnect(con) ``` ## SQL transactions with DBI DBI allows you to group multiple queries into a single atomic transaction. Transactions are initiated with `dbBegin()` and either made persistent with `dbCommit()` or undone with `dbRollback()`. The example below updates two tables and ensures that either both tables are updated, or no changes are persisted to the database and an error is thrown. ```{r} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) withdraw <- function(amount) { # All operations must be carried out as logical unit: dbExecute(con, "UPDATE cash SET amount = amount + ?", list(amount)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(amount)) } withdraw_transacted <- function(amount) { # Ensure atomicity dbBegin(con) # Perform operation withdraw(amount) # Persist results dbCommit(con) } withdraw_transacted(300) ``` After withdrawing 300 credits, the cash is increased and the account is decreased by this amount. The transaction ensures that either both operations succeed, or no change occurs. ```{r} dbReadTable(con, "cash") dbReadTable(con, "account") ``` We can roll back changes manually if necessary. Do not forget to call `dbRollback()` in case of error, otherwise the transaction remains open indefinitely. ```{r} withdraw_if_funds <- function(amount) { dbBegin(con) withdraw(amount) # Rolling back after detecting negative value on account: if (dbReadTable(con, "account")$amount >= 0) { dbCommit(con) TRUE } else { message("Insufficient funds") dbRollback(con) FALSE } } withdraw_if_funds(5000) dbReadTable(con, "cash") dbReadTable(con, "account") ``` `dbWithTransaction()` simplifies using transactions. Pass it a connection and the code you want to run as a transaction. It will execute the code and call `dbCommit()` on success and call `dbRollback()` if an error is thrown. ```{r error = TRUE} withdraw_safely <- function(amount) { dbWithTransaction(con, { withdraw(amount) if (dbReadTable(con, "account")$amount < 0) { stop("Error: insufficient funds", call. = FALSE) } }) } withdraw_safely(5000) dbReadTable(con, "cash") dbReadTable(con, "account") ``` As usual, do not forget to disconnect from the database when done. ```{r} dbDisconnect(con) ``` ## Conclusion That concludes the major features of DBI. For more details on the library functions covered in this tutorial and the `vignette("DBI", package = "DBI")` introductory tutorial see the DBI specification at `vignette("spec", package = "DBI")`. If you are after a data manipulation library that works at a higher level of abstraction, check out [dplyr](https://dplyr.tidyverse.org). It is a grammar of data manipulation that can work with local dataframes and remote databases and uses DBI under the hood. DBI/inst/doc/DBI-history.Rmd0000644000176200001440000001221414602466070015140 0ustar liggesusers--- title: "History of DBI" author: "David James" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{History of DBI} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- The following history of DBI was contributed by David James, the driving force behind the development of DBI, and many of the packages that implement it. The idea/work of interfacing S (originally S3 and S4) to RDBMS goes back to the mid- and late 1990's in Bell Labs. The first toy interface I did was to implement John Chamber's early concept of "Data Management in S" (1991). The implementation followed that interface pretty closely and immediately showed some of the limitations when dealing with very large databases; if my memory serves me, the issue was the instance-based of the language back then, e.g., if you attached an RDBMS to the `search()` path and then needed to resolve a symbol "foo", you effectively had to bring all the objects in the database to check their mode/class, i.e., the instance object had the metadata in itself as attributes. The experiment showed that the S3 implementation of "data management" was not really suitable to large external RDBMS (probably it was never intended to do that anyway). (Note however, that since then, John and Duncan Temple Lang generalized the data management in S4 a lot, including Duncan's implementation in his RObjectTables package where he considered a lot of synchronization/caching issues relevant to DBI and, more generally, to most external interfaces). Back then we were working very closely with Lucent's microelectronics manufacturing --- our colleagues there had huge Oracle (mostly) databases that we needed to constantly query via [SQL*Plus](https://en.wikipedia.org/wiki/SQL*Plus). My colleague Jake Luciani was developing advanced applications in C and SQL, and the two of us came up with the first implementation of S3 directly connecting with Oracle. What I remember is that the Linux [PRO*C](https://en.wikipedia.org/wiki/Pro*C) pre-compiler (that embedded SQL in C code) was very buggy --- we spent a lot of time looking for workarounds and tricks until we got the C interface running. At the time, other projects within Bell Labs began using MySQL, and we moved to MySQL (with the help of Doug Bates' student Saikat DebRoy, then a summer intern) with no intentions of looking back at the very difficult Oracle interface. It was at this time that I moved all the code from S3 methods to S4 classes and methods and begun reaching out to the S/R community for suggestions, ideas, etc. All (most) of this work was on Bell Labs versions of S3 and S4, but I made sure it worked with S-Plus. At some point around 2000 (I don't remember exactly when), I ported all the code to R regressing to S3 methods, and later on (once S4 classes and methods were available in R) I re-implemented everything back to S4 classes and methods in R (a painful back-and-forth). It was at this point that I decided to drop S-Plus altogether. Around that time, I came across a very early implementation of SQLite and I was quite interested and thought it was a very nice RDBMS that could be used for all kinds of experimentation, etc., so it was pretty easy to implement on top of the DBI. Within the R community, there were quite a number of people that showed interest on defining a common interface to databases, but only a few folks actually provided code/suggestions/etc. (Tim Keitt was most active with the dbi/PostgreSQL packages --- he also was considering what he called "proxy" objects, which was reminiscent of what Duncan had been doing). Kurt Hornick, Vincent Carey, Robert Gentleman, and others provided suggestions/comments/support for the DBI definition. By around 2003, the DBI was more or less implemented as it is today. I'm sure I'll forget some (most should be in the THANKS sections of the various packages), but the names that come to my mind at this moment are Jake Luciani (ROracle), Don MacQueen and other early ROracle users (super helpful), Doug Bates and his student Saikat DebRoy for RMySQL, Fei Chen (at the time a student of Prof. Ripley) also contributed to RMySQL, Tim Keitt (working on an early S3 interface to PostgrSQL), Torsten Hothorn (worked with mSQL and also MySQL), Prof. Ripley working/extending the RODBC package, in addition to John Chambers and Duncan Temple-Lang who provided very important comments and suggestions. Actually, the real impetus behind the DBI was always to do distributed statistical computing --- *not* to provide a yet-another import/export mechanism --- and this perspective was driven by John and Duncan's vision and work on inter-system computing, COM, CORBA, etc. I'm not sure many of us really appreciated (even now) the full extent of those ideas and concepts. Just like in other languages (C's ODBC, Java's JDBC, Perl's DBI/DBD, Python dbapi), R/S DBI was meant to unify the interfacing to RDBMS so that R/S applications could be developed on top of the DBI and not be hard coded to any one relation database. The interface I tried to follow the closest was the Python's DBAPI --- I haven't worked on this topic for a while, but I still feel Python's DBAPI is the cleanest and most relevant for the S language. DBI/inst/doc/DBI-1.html0000644000176200001440000042621315147357114014034 0ustar liggesusers A Common Database Interface (DBI)

A Common Database Interface (DBI)

R-Databases Special Interest Group

16 June 2003

This document describes a common interface between the S language (in its R and S-Plus implementations) and database management systems (DBMS). The interface defines a small set of classes and methods similar in spirit to Perl’s DBI, Java’s JDBC, Python’s DB-API, and Microsoft’s ODBC.

Version

This document describes version 0.1-6 of the database interface API (application programming interface).

Introduction

The database interface (DBI) separates the connectivity to the DBMS into a “front-end� and a “back-end�. Applications use only the exposed “front-end� API. The facilities that communicate with specific DBMS (Oracle, PostgreSQL, etc.) are provided by “device drivers� that get invoked automatically by the S language evaluator. The following example illustrates some of the DBI capabilities:

## Choose the proper DBMS driver and connect to the server

drv <- dbDriver("ODBC")
con <- dbConnect(drv, "dsn", "usr", "pwd")

## The interface can work at a higher level importing tables
## as data.frames and exporting data.frames as DBMS tables.

dbListTables(con)
dbListFields(con, "quakes")
if(dbExistsTable(con, "new_results"))
   dbRemoveTable(con, "new_results")
dbWriteTable(con, "new_results", new.output)

## The interface allows lower-level interface to the DBMS
res <- dbSendQuery(con, paste(
            "SELECT g.id, g.mirror, g.diam, e.voltage",
            "FROM geom_table as g, elec_measures as e",
            "WHERE g.id = e.id and g.mirrortype = 'inside'",
            "ORDER BY g.diam"))
out <- NULL
while(!dbHasCompleted(res)){
   chunk <- fetch(res, n = 10000)
   out <- c(out, doit(chunk))
}

## Free up resources
dbClearResult(res)
dbDisconnect(con)
dbUnloadDriver(drv)

(only the first 2 expressions are DBMS-specific – all others are independent of the database engine itself).

Individual DBI drivers need not implement all the features we list below (we indicate those that are optional). Furthermore, drivers may extend the core DBI facilities, but we suggest to have these extensions clearly indicated and documented.

The following are the elements of the DBI:

  1. A set of classes and methods (Section [sec:DBIClasses]) that defines what operations are possible and how they are defined, e.g.:

    • connect/disconnect to the DBMS

    • create and execute statements in the DBMS

    • extract results/output from statements

    • error/exception handling

    • information (meta-data) from database objects

    • transaction management (optional)

    Some things are left explicitly unspecified, e.g., authentication and even the query language, although it is hard to avoid references to SQL and relational database management systems (RDBMS).

  2. Drivers

    Drivers are collection of functions that implement the functionality defined above in the context of specific DBMS, e.g., mSQL, Informix.

  3. Data type mappings (Section [sec:data-mappings].)

    Mappings and conversions between DBMS data types and R/S objects. All drivers should implement the “basic� primitives (see below), but may chose to add user-defined conversion function to handle more generic objects (e.g., factors, ordered factors, time series, arrays, images).

  4. Utilities (Section [sec:utilities].)

    These facilities help with details such as mapping of identifiers between S and DBMS (e.g., _ is illegal in R/S names, and . is used for constructing compound SQL identifiers), etc.

DBI Classes and Methods

The following are the main DBI classes. They need to be extended by individual database back-ends (Sybase, Oracle, etc.) Individual drivers need to provide methods for the generic functions listed here (those methods that are optional are so indicated).

Note: Although R releases prior to 1.4 do not have a formal concept of classes, we will use the syntax of the S Version 4 classes and methods (available in R releases 1.4 and later as library methods) to convey precisely the DBI class hierarchy, its methods, and intended behavior.

The DBI classes are DBIObject, DBIDriver, DBIConnection and DBIResult. All these are virtual classes. Drivers define new classes that extend these, e.g., PgSQLDriver, PgSQLConnection, and so on.

Class hierarchy for the DBI. The top two layers are comprised of virtual classes and each lower layer represents a set of driver-specific implementation classes that provide the functionality defined by the virtual classes above.
Class hierarchy for the DBI. The top two layers are comprised of virtual classes and each lower layer represents a set of driver-specific implementation classes that provide the functionality defined by the virtual classes above.
DBIObject:

Virtual class1 that groups all other DBI classes.

DBIDriver:

Virtual class that groups all DBMS drivers. Each DBMS driver extends this class. Typically generator functions instantiate the actual driver objects, e.g., PgSQL, HDF5, BerkeleyDB.

DBIConnection:

Virtual class that encapsulates connections to DBMS.

DBIResult:

Virtual class that describes the result of a DBMS query or statement.

[Q: Should we distinguish between a simple result of DBMS statements e.g., as delete from DBMS queries (i.e., those that generate data).]

The methods format, print, show, dbGetInfo, and summary are defined (and implemented in the DBI package) for the DBIObject base class, thus available to all implementations; individual drivers, however, are free to override them as they see fit.

format(x, ...):

produces a concise character representation (label) for the DBIObject x.

print(x, ...)/show(x):

prints a one-line identification of the object x.

summary(object, ...):

produces a concise description of the object. The default method for DBIObject simply invokes dbGetInfo(dbObj) and prints the name-value pairs one per line. Individual implementations may tailor this appropriately.

dbGetInfo(dbObj, ...):

extracts information (meta-data) relevant for the DBIObject dbObj. It may return a list of key/value pairs, individual meta-data if supplied in the call, or NULL if the requested meta-data is not available.

Hint: Driver implementations may choose to allow an argument what to specify individual meta-data, e.g., dbGetInfo(drv, what = max.connections).

In the next few sub-sections we describe in detail each of these classes and their methods.

Class DBIObject

This class simply groups all DBI classes, and thus all extend it.

Class DBIDriver

This class identifies the database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.)

The DBI provides the generator dbDriver(driverName) which simply invokes the function driverName, which in turn instantiates the corresponding driver object.

The DBIDriver class defines the following methods:

driverName:

[meth:driverName] initializes the driver code. The name driverName refers to the actual generator function for the DBMS, e.g., RPgSQL, RODBC, HDF5. The driver instance object is used with dbConnect (see page ) for opening one or possibly more connections to one or more DBMS.

dbListConnections(drv, ...):

list of current connections being handled by the drv driver. May be NULL if there are no open connections. Drivers that do not support multiple connections may return the one open connection.

dbGetInfo(dbObj, ...):

returns a list of name-value pairs of information about the driver.

Hint: Useful entries could include

name:

the driver name (e.g., RODBC, RPgSQL);

driver.version:

version of the driver;

DBI.version:

the version of the DBI that the driver implements, e.g., 0.1-2;

client.version:

of the client DBMS libraries (e.g., version of the libpq library in the case of RPgSQL);

max.connections:

maximum number of simultaneous connections;

plus any other relevant information about the implementation, for instance, how the driver handles upper/lower case in identifiers.

dbUnloadDriver(driverName) (optional):

frees all resources (local and remote) used by the driver. Returns a logical to indicate if it succeeded or not.

Class DBIConnection

This virtual class encapsulates the connection to a DBMS, and it provides access to dynamic queries, result sets, DBMS session management (transactions), etc.

Note: Individual drivers are free to implement single or multiple simultaneous connections.

The methods defined by the DBIConnection class include:

dbConnect(drv, ...):

[meth:dbConnect] creates and opens a connection to the database implemented by the driver drv (see Section [sec:DBIDriver]). Each driver will define what other arguments are required, e.g., dbname or dsn for the database name, user, and password. It returns an object that extends DBIConnection in a driver-specific manner (e.g., the MySQL implementation could create an object of class MySQLConnection that extends DBIConnection).

dbDisconnect(conn, ...):

closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). Returns a logical indicating whether it succeeded or not.

dbSendQuery(conn, statement, ...):

submits one statement to the DBMS. It returns a DBIResult object. This object is needed for fetching data in case the statement generates output (see fetch on page ), and it may be used for querying the state of the operation; see dbGetInfo and other meta-data methods on page .

dbGetQuery(conn, statement, ...):

submit, execute, and extract output in one operation. The resulting object may be a data.frame if the statement generates output. Otherwise the return value should be a logical indicating whether the query succeeded or not.

dbGetException(conn, ...):

returns a list with elements errNum and errMsg with the status of the last DBMS statement sent on a given connection (this information may also be provided by the dbGetInfo meta-data function on the conn object.

Hint: The ANSI SQL-92 defines both a status code and an status message that could be return as members of the list.

dbGetInfo(dbObj, ...):

returns a list of name-value pairs describing the state of the connection; it may return one or more meta-data, the actual driver method allows to specify individual pieces of meta-data (e.g., maximum number of open results/cursors).

Hint: Useful entries could include

dbname:

the name of the database in use;

db.version:

the DBMS server version (e.g., “Oracle 8.1.7 on Solaris�;

host:

host where the database server resides;

user:

user name;

password:

password (is this safe?);

plus any other arguments related to the connection (e.g., thread id, socket or TCP connection type).

dbListResults(conn, ...):

list of DBIResult objects currently active on the connection conn. May be NULL if no result set is active on conn. Drivers that implement only one result set per connection could return that one object (no need to wrap it in a list).

Note: The following are convenience methods that simplify the import/export of (mainly) data.frames. The first five methods implement the core methods needed to attach remote DBMS to the S search path. (For details, see Chambers (1991, 1998).)

Hint: For relational DBMS these methods may be easily implemented using the core DBI methods dbConnect, dbSendQuery, and fetch, due to SQL reflectance (i.e., one easily gets this meta-data by querying the appropriate tables on the RDBMS).

dbListTables(conn, ...):

returns a character vector (possibly of zero-length) of object (table) names available on the conn connection.

dbReadTable(conn, name, ...):

imports the data stored remotely in the table name on connection conn. Use the field row.names as the row.names attribute of the output data.frame. Returns a data.frame.

[Q: should we spell out how row.names should be created? E.g., use a field (with unique values) as row.names? Also, should dbReadTable reproduce a data.frame exported with dbWriteTable?]

dbWriteTable(conn, name, value, ...):

write the object value (perhaps after coercing it to data.frame) into the remote object name in connection conn. Returns a logical indicating whether the operation succeeded or not.

dbExistsTable(conn, name, ...):

does remote object name exist on conn? Returns a logical.

dbRemoveTable(conn, name, ...):

removes remote object name on connection conn. Returns a logical indicating whether the operation succeeded or not.

dbListFields(conn, name, ...):

returns a character vector listing the field names of the remote table name on connection conn (see dbColumnInfo() for extracting data type on a table).

Note: The following methods deal with transactions and stored procedures. All these functions are optional.

dbCommit(conn, ...)(optional):

commits pending transaction on the connection and returns TRUE or FALSE depending on whether the operation succeeded or not.

dbRollback(conn, ...)(optional):

undoes current transaction on the connection and returns TRUE or FALSE depending on whether the operation succeeded or not.

dbCallProc(conn, storedProc, ...)(optional):

invokes a stored procedure in the DBMS and returns a DBIResult object.

[Stored procedures are not part of the ANSI SQL-92 standard and vary substantially from one RDBMS to another.]

Deprecated since 2014:

The recommended way of calling a stored procedure is now

  • dbGetQuery if a result set is returned and
  • dbExecute for data manipulation and other cases that do not return a result set.

Class DBIResult

This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query). The result set res keeps track of whether the statement produces output for R/S, how many rows were affected by the operation, how many rows have been fetched (if statement is a query), whether there are more rows to fetch, etc.

Note: Individual drivers are free to allow single or multiple active results per connection.

[Q: Should we distinguish between results that return no data from those that return data?]

The class DBIResult defines the following methods:

fetch(res, n, ...):

[meth:fetch] fetches the next n elements (rows) from the result set res and return them as a data.frame. A value of n=-1 is interpreted as “return all elements/rows�.

dbClearResult(res, ...):

flushes any pending data and frees all resources (local and remote) used by the object res on both sides of the connection. Returns a logical indicating success or not.

dbGetInfo(dbObj, ...):

returns a name-value list with the state of the result set.

Hint: Useful entries could include

statement:

a character string representation of the statement being executed;

rows.affected:

number of affected records (changed, deleted, inserted, or extracted);

row.count:

number of rows fetched so far;

has.completed:

has the statement (query) finished?

is.select:

a logical describing whether or not the statement generates output;

plus any other relevant driver-specific meta-data.

dbColumnInfo(res, ...):

produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame should describe an aspect of the result set field (field name, type, etc.)

Hint: The data.frame columns could include

field.name:

DBMS field label;

field.type:

DBMS field type (implementation-specific);

data.type:

corresponding R/S data type, e.g., integer;

precision/scale:

(as in ODBC terminology), display width and number of decimal digits, respectively;

nullable:

whether the corresponding field may contain (DBMS) NULL values;

plus other driver-specific information.

dbSetDataMappings(flds, ...)(optional):

defines a conversion between internal DBMS data types and R/S classes. We expect the default mappings (see Section [sec:data-mappings]) to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. [This topic needs further discussion.]

Note: The following are convenience methods that extract information from the result object (they may be implemented by invoking dbGetInfo with appropriate arguments).

dbGetStatement(res, ...)(optional):

returns the DBMS statement (as a character string) associated with the result res.

dbGetRowsAffected(res, ...)(optional):

returns the number of rows affected by the executed statement (number of records deleted, modified, extracted, etc.)

dbHasCompleted(res, ...)(optional):

returns a logical that indicates whether the operation has been completed (e.g., are there more records to be fetched?).

dbGetRowCount(res, ...)(optional):

returns the number of rows fetched so far.

Data Type Mappings

The data types supported by databases are different than the data types in R and S, but the mapping between the “primitive� types is straightforward: Any of the many fixed and varying length character types are mapped to R/S character. Fixed-precision (non-IEEE) numbers are mapped into either doubles (numeric) or long (integer). Notice that many DBMS do not follow the so-called IEEE arithmetic, so there are potential problems with under/overflows and loss of precision, but given the R/S primitive types we cannot do too much but identify these situations and warn the application (how?).

By default dates and date-time objects are mapped to character using the appropriate TO_CHAR function in the DBMS (which should take care of any locale information). Some RDBMS support the type CURRENCY or MONEY which should be mapped to numeric (again with potential round off errors). Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion (as has been done in other inter-systems packages 2).

Specifying user-defined conversion functions still needs to be defined.

Utilities

The core DBI implementation should make available to all drivers some common basic utilities. For instance:

dbGetDBIVersion:

returns the version of the currently attached DBI as a string.

dbDataType(dbObj, obj, ...):

returns a string with the (approximately) appropriate data type for the R/S object obj. The DBI can implement this following the ANSI-92 standard, but individual drivers may want/need to extend it to make use of DBMS-specific types.

make.db.names(dbObj, snames, ...):

maps R/S names (identifiers) to SQL identifiers replacing illegal characters (as .) by the legal SQL _.

SQLKeywords(dbObj, ...):

returns a character vector of SQL keywords (reserved words). The default method returns the list of .SQL92Keywords, but drivers should update this vector with the DBMS-specific additional reserved words.

isSQLKeyword(dbObj, name, ...):

for each element in the character vector name determine whether or not it is an SQL keyword, as reported by the generic function SQLKeywords. Returns a logical vector parallel to the input object name.

Open Issues and Limitations

There are a number of issues and limitations that the current DBI conscientiously does not address on the interest of simplicity. We do list here the most important ones.

Non-SQL:

Is it realistic to attempt to encompass non-relational databases, like HDF5, Berkeley DB, etc.?

Security:

allowing users to specify their passwords on R/S scripts may be unacceptable for some applications. We need to consider alternatives where users could store authentication on files (perhaps similar to ODBC’s odbc.ini) with more stringent permissions.

Exceptions:

the exception mechanism is a bit too simple, and it does not provide for information when problems stem from the DBMS interface itself. For instance, under/overflow or loss of precision as we move numeric data from DBMS to the more limited primitives in R/S.

Asynchronous communication:

most DBMS support both synchronous and asynchronous communications, allowing applications to submit a query and proceed while the database server process the query. The application is then notified (or it may need to poll the server) when the query has completed. For large computations, this could be very useful, but the DBI would need to specify how to interrupt the server (if necessary) plus other details. Also, some DBMS require applications to use threads to implement asynchronous communication, something that neither R nor S-Plus currently addresses.

SQL scripts:

the DBI only defines how to execute one SQL statement at a time, forcing users to split SQL scripts into individual statements. We need a mechanism by which users can submit SQL scripts that could possibly generate multiple result sets; in this case we may need to introduce new methods to loop over multiple results (similar to Python’s nextResultSet).

BLOBS/CLOBS:

large objects (both character and binary) present some challenges both to R and S-Plus. It is becoming more common to store images, sounds, and other data types as binary objects in DBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects.

Transactions:

transaction management is not fully described.

Additional methods:

Do we need any additional methods? (e.g., dbListDatabases(conn), dbListTableIndices(conn, name), how do we list all available drivers?)

Bind variables:

the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variables�; this is a mechanism by which the contents of R/S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement

  /* SQL */
  SELECT * from emp_table where emp_id = :sampleEmployee

would take the vector sampleEmployee and iterate over each of its elements to get the result. Perhaps the DBI could at some point in the future implement this feature.

Resources

The idea of a common interface to databases has been successfully implemented in various environments, for instance:

Java’s Database Connectivity (JDBC) (www.javasoft.com).

In C through the Open Database Connectivity (ODBC) (www.unixodbc.org).

Python’s Database Application Programming Interface (www.python.org).

Perl’s Database Interface (dbi.perl.org).

Chambers, John M. 1991. Data Management in S. Bell Labs, Lucent Technologies.
Chambers, John M. 1998. Database Classes. Bell Labs, Lucent Technologies.

  1. A virtual class allows us to group classes that share some common characteristics, even if their implementations are radically different.↩︎

  2. Duncan Temple Lang has volunteered to port the data conversion code found in R-Java, R-Perl, and R-Python packages to the DBI↩︎

DBI/inst/doc/DBI-advanced.html0000644000176200001440000013505715147357121015442 0ustar liggesusers Advanced DBI Usage

Advanced DBI Usage

James Wondrasek, Kirill Müller

17/03/2020

Who this tutorial is for

This tutorial is for you if you need to use a richer set of SQL features such as data manipulation queries, parameterized queries and queries performed using SQL’s transaction features. See vignette("DBI", package = "DBI") for a more basic tutorial covering connecting to DBMS and executing simple queries.

How to run more complex queries using DBI

dbGetQuery() works by calling a number of functions behind the scenes. If you need more control you can manually build your own query, retrieve results at your selected rate, and release the resources involved by calling the same functions.

These functions are:

  • dbSendQuery() sends the SQL query to the DBMS and returns a result object. The query is limited to SELECT statements. If you want to send other statements, such as INSERT, UPDATE, DELETE, etc, use dbSendStatement().
  • dbFetch() is called with the result object returned by dbSendQuery(). It also accepts an argument specifying the number of rows to be returned, e.g. n = 200. If you want to fetch all the rows, use n = -1.
  • dbClearResult() is called when you have finished retrieving data. It releases the resources associated with the result object.
library(DBI)

con <- dbConnect(
  RMariaDB::MariaDB(),
  host = "relational.fel.cvut.cz",
  port = 3306,
  username = "guest",
  password = "ctu-relational",
  dbname = "sakila"
)

res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = 'G'")
df <- dbFetch(res, n = 3)
dbClearResult(res)

head(df, 3)
##   film_id            title
## 1       2   ACE GOLDFINGER
## 2       4 AFFAIR PREJUDICE
## 3       5      AFRICAN EGG
##                                                                                                             description
## 1                  A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 2                          A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
## 3 A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               3        4.99
## 2         2006           1                   NA               5        2.99
## 3         2006           1                   NA               6        2.99
##   length replacement_cost rating               special_features
## 1     48            12.99      G        Trailers,Deleted Scenes
## 2    117            26.99      G Commentaries,Behind the Scenes
## 3    130            22.99      G                 Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42

How to read part of a table from a database

If your dataset is large you may want to fetch a limited number of rows at a time. As demonstrated below, this can be accomplished by using a while loop where the function dbHasCompleted() is used to check for ongoing rows, and dbFetch() is used with the n = X argument, specifying how many rows to return on each iteration. Again, we call dbClearResult() at the end to release resources.

res <- dbSendQuery(con, "SELECT * FROM film")
while (!dbHasCompleted(res)) {
  chunk <- dbFetch(res, n = 300)
  print(nrow(chunk))
}
## [1] 300
## [1] 300
## [1] 300
## [1] 100
dbClearResult(res)

How to use parameters (safely) in SQL queries

dbSendQuery() can be used with parameterized SQL queries. DBI supports two ways to avoid SQL injection attacks from user-supplied parameters: quoting and parameterized queries.

Quoting

Quoting of parameter values is performed using the function dbQuoteLiteral(), which supports many R data types, including date and time.1

In cases where users may be supplying table or column names to use in the query for data retrieval, those names or identifiers must also be escaped. As there may be DBMS-specific rules for escaping these identifiers, DBI provides the function dbQuoteIdentifier() to generate a safe string representation.

safe_id <- dbQuoteIdentifier(con, "rating")
safe_param <- dbQuoteLiteral(con, "G")

query <- paste0("SELECT title, ", safe_id, " FROM film WHERE ", safe_id, " = ", safe_param)
query
## [1] "SELECT title, `rating` FROM film WHERE `rating` = 'G'"
res <- dbSendQuery(con, query)
dbFetch(res)
##              title rating
## 1   ACE GOLDFINGER      G
## 2 AFFAIR PREJUDICE      G
## 3      AFRICAN EGG      G
## Showing 3 out of 178 rows.
dbClearResult(res)

The same result can be had by using glue::glue_sql(). It performs the same safe quoting on any variable or R statement appearing between braces within the query string.

id <- "rating"
param <- "G"
query <- glue::glue_sql("SELECT title, {`id`} FROM film WHERE {`id`} = {param}", .con = con)

df <- dbGetQuery(con, query)
head(df, 3)
##              title rating
## 1   ACE GOLDFINGER      G
## 2 AFFAIR PREJUDICE      G
## 3      AFRICAN EGG      G

Parameterized queries

Rather than performing the parameter substitution ourselves, we can push it to the DBMS by including placeholders in the query. Different DBMS use different placeholder schemes, DBI passes through the SQL expression unchanged.

MariaDB uses a question mark (?) as placeholder and expects an unnamed list of parameter values. Other DBMS may use named parameters. We recommend consulting the documentation for the DBMS you are using. As an example, a web search for “mariadb parameterized queries� leads to the documentation for the PREPARE statement which mentions:

Within the statement, “?� characters can be used as parameter markers to indicate where data values are to be bound to the query later when you execute it.

Currently there is no list of which placeholder scheme a particular DBMS supports.

Placeholders only work for literal values. Other parts of the query, e.g. table or column identifiers, still need to be quoted with dbQuoteIdentifier().

For a single set of parameters, the params argument to dbSendQuery() or dbGetQuery() can be used. It takes a list and its members are substituted in order for the placeholders within the query.

params <- list("G")
safe_id <- dbQuoteIdentifier(con, "rating")

query <- paste0("SELECT * FROM film WHERE ", safe_id, " = ?")
query
## [1] "SELECT * FROM film WHERE `rating` = ?"
res <- dbSendQuery(con, query, params = params)
dbFetch(res, n = 3)
##   film_id            title
## 1       2   ACE GOLDFINGER
## 2       4 AFFAIR PREJUDICE
## 3       5      AFRICAN EGG
##                                                                                                             description
## 1                  A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 2                          A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
## 3 A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               3        4.99
## 2         2006           1                   NA               5        2.99
## 3         2006           1                   NA               6        2.99
##   length replacement_cost rating               special_features
## 1     48            12.99      G        Trailers,Deleted Scenes
## 2    117            26.99      G Commentaries,Behind the Scenes
## 3    130            22.99      G                 Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42
dbClearResult(res)

Below is an example query using multiple placeholders with the MariaDB driver. The placeholders are supplied as a list of values ordered to match the position of the placeholders in the query.

q_params <- list("G", 90)
query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?"

res <- dbSendQuery(con, query, params = q_params)
dbFetch(res, n = 3)
##              title rating length
## 1 AFFAIR PREJUDICE      G    117
## 2      AFRICAN EGG      G    130
## 3  ALAMO VIDEOTAPE      G    126
dbClearResult(res)

When you wish to perform the same query with different sets of parameter values, dbBind() is used. There are two ways to use dbBind(). Firstly, it can be used multiple times with same query.

res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?")
dbBind(res, list("G"))
dbFetch(res, n = 3)
##   film_id            title
## 1       2   ACE GOLDFINGER
## 2       4 AFFAIR PREJUDICE
## 3       5      AFRICAN EGG
##                                                                                                             description
## 1                  A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 2                          A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
## 3 A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               3        4.99
## 2         2006           1                   NA               5        2.99
## 3         2006           1                   NA               6        2.99
##   length replacement_cost rating               special_features
## 1     48            12.99      G        Trailers,Deleted Scenes
## 2    117            26.99      G Commentaries,Behind the Scenes
## 3    130            22.99      G                 Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42
dbBind(res, list("PG"))
dbFetch(res, n = 3)
##   film_id            title
## 1       1 ACADEMY DINOSAUR
## 2       6     AGENT TRUMAN
## 3      12   ALASKA PHANTOM
##                                                                                        description
## 1 A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies
## 2        A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China
## 3               A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               6        0.99
## 2         2006           1                   NA               3        2.99
## 3         2006           1                   NA               6        0.99
##   length replacement_cost rating                 special_features
## 1     86            20.99     PG Deleted Scenes,Behind the Scenes
## 2    169            17.99     PG                   Deleted Scenes
## 3    136            22.99     PG      Commentaries,Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42
dbClearResult(res)

Secondly, dbBind() can be used to execute the same statement with multiple values at once.

res <- dbSendQuery(con, "SELECT * FROM film WHERE rating = ?")
dbBind(res, list(c("G", "PG")))
dbFetch(res, n = 3)
##   film_id            title
## 1       2   ACE GOLDFINGER
## 2       4 AFFAIR PREJUDICE
## 3       5      AFRICAN EGG
##                                                                                                             description
## 1                  A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 2                          A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
## 3 A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               3        4.99
## 2         2006           1                   NA               5        2.99
## 3         2006           1                   NA               6        2.99
##   length replacement_cost rating               special_features
## 1     48            12.99      G        Trailers,Deleted Scenes
## 2    117            26.99      G Commentaries,Behind the Scenes
## 3    130            22.99      G                 Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42
dbClearResult(res)

Use a list of vectors if your query has multiple parameters:

q_params <- list(c("G", "PG"), c(90, 120))
query <- "SELECT title, rating, length FROM film WHERE rating = ? AND length >= ?"

res <- dbSendQuery(con, query, params = q_params)
dbFetch(res, n = 3)
##              title rating length
## 1 AFFAIR PREJUDICE      G    117
## 2      AFRICAN EGG      G    130
## 3  ALAMO VIDEOTAPE      G    126
dbClearResult(res)

Always disconnect from the database when done.

dbDisconnect(con)

SQL data manipulation - UPDATE, DELETE and friends

For SQL queries that affect the underlying database, such as UPDATE, DELETE, INSERT INTO, and DROP TABLE, DBI provides two functions. dbExecute() passes the SQL statement to the DBMS for execution and returns the number of rows affected. dbSendStatement() performs in the same manner, but returns a result object. Call dbGetRowsAffected() with the result object to get the count of the affected rows. You then need to call dbClearResult() with the result object afterwards to release resources.

In actuality, dbExecute() is a convenience function that calls dbSendStatement(), dbGetRowsAffected(), and dbClearResult(). You can use these functions if you need more control over the query process.

The subsequent examples use an in-memory SQL database provided by RSQLite::SQLite(), because the remote database used in above examples does not allow writing.

library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cars", head(cars, 3))

dbExecute(
  con,
  "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)"
)
## [1] 3
rs <- dbSendStatement(
  con,
  "INSERT INTO cars (speed, dist) VALUES (4, 4), (5, 5), (6, 6)"
)
dbGetRowsAffected(rs)
## [1] 3
dbClearResult(rs)

dbReadTable(con, "cars")
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## Showing 3 out of 9 rows.

Do not forget to disconnect from the database at the end.

dbDisconnect(con)

SQL transactions with DBI

DBI allows you to group multiple queries into a single atomic transaction. Transactions are initiated with dbBegin() and either made persistent with dbCommit() or undone with dbRollback(). The example below updates two tables and ensures that either both tables are updated, or no changes are persisted to the database and an error is thrown.

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "cash", data.frame(amount = 100))
dbWriteTable(con, "account", data.frame(amount = 2000))

withdraw <- function(amount) {
  # All operations must be carried out as logical unit:
  dbExecute(con, "UPDATE cash SET amount = amount + ?", list(amount))
  dbExecute(con, "UPDATE account SET amount = amount - ?", list(amount))
}

withdraw_transacted <- function(amount) {
  # Ensure atomicity
  dbBegin(con)

  # Perform operation
  withdraw(amount)

  # Persist results
  dbCommit(con)
}

withdraw_transacted(300)

After withdrawing 300 credits, the cash is increased and the account is decreased by this amount. The transaction ensures that either both operations succeed, or no change occurs.

dbReadTable(con, "cash")
##   amount
## 1    400
dbReadTable(con, "account")
##   amount
## 1   1700

We can roll back changes manually if necessary. Do not forget to call dbRollback() in case of error, otherwise the transaction remains open indefinitely.

withdraw_if_funds <- function(amount) {
  dbBegin(con)
  withdraw(amount)
  # Rolling back after detecting negative value on account:
  if (dbReadTable(con, "account")$amount >= 0) {
    dbCommit(con)
    TRUE
  } else {
    message("Insufficient funds")
    dbRollback(con)
    FALSE
  }
}

withdraw_if_funds(5000)
## Insufficient funds
## [1] FALSE
dbReadTable(con, "cash")
##   amount
## 1    400
dbReadTable(con, "account")
##   amount
## 1   1700

dbWithTransaction() simplifies using transactions. Pass it a connection and the code you want to run as a transaction. It will execute the code and call dbCommit() on success and call dbRollback() if an error is thrown.

withdraw_safely <- function(amount) {
  dbWithTransaction(con, {
    withdraw(amount)
    if (dbReadTable(con, "account")$amount < 0) {
      stop("Error: insufficient funds", call. = FALSE)
    }
  })
}

withdraw_safely(5000)
## Error:
## ! Error: insufficient funds
dbReadTable(con, "cash")
##   amount
## 1    400
dbReadTable(con, "account")
##   amount
## 1   1700

As usual, do not forget to disconnect from the database when done.

dbDisconnect(con)

Conclusion

That concludes the major features of DBI. For more details on the library functions covered in this tutorial and the vignette("DBI", package = "DBI") introductory tutorial see the DBI specification at vignette("spec", package = "DBI"). If you are after a data manipulation library that works at a higher level of abstraction, check out dplyr. It is a grammar of data manipulation that can work with local dataframes and remote databases and uses DBI under the hood.


  1. An older method, dbQuoteString(), was used to quote string values only. The dbQuoteLiteral() method forwards to dbQuoteString() for character vectors. Users do not need to distinguish between these two cases.↩︎

DBI/inst/doc/DBI.Rmd0000644000176200001440000001624315005325062013440 0ustar liggesusers--- title: "Introduction to DBI" author: "James Wondrasek, Katharina Brunner, Kirill Müller" date: "27 February 2020" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Introduction to DBI} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set( echo = TRUE, error = Sys.getenv("IN_PKGDOWN") != "true" || (getRversion() < "3.5") ) ``` ## Who this tutorial is for This tutorial is for you if you want to access or manipulate data in a database that may be on your machine or on a different computer on the internet, and you have found libraries that use a higher level of abstraction, such as [dbplyr](https://dbplyr.tidyverse.org/), are not suitable for your purpose. Depending on what you want to achieve, you may find it useful to have an understanding of SQL before using DBI. The DBI (**D**ata**B**ase **I**nterface) package provides a simple, consistent interface between R and database management systems (DBMS). Each supported DBMS is supported by its own R package that implements the DBI specification in `vignette("spec", package = "DBI")`. DBI currently supports about 30 DBMS, including: * MySQL, using the R-package [RMySQL](https://github.com/r-dbi/RMySQL) * MariaDB, using the R-package [RMariaDB](https://github.com/r-dbi/RMariaDB) * Postgres, using the R-package [RPostgres](https://github.com/r-dbi/RPostgres) * SQLite, using the R-package [RSQLite](https://github.com/r-dbi/RSQLite) For a more complete list of supported DBMS visit [https://github.com/r-dbi/backends](https://github.com/r-dbi/backends#readme). You may need to install the package specific to your DBMS. The functionality currently supported for each of these DBMS's includes: - manage a connection to a database - list the tables in a database - list the column names in a table - read a table into a data frame For more advanced features, such as parameterized queries, transactions, and more see `vignette("DBI-advanced", package = "DBI")`. ## How to connect to a database using DBI The following code establishes a connection to the Sakila database hosted by the Relational Dataset Repository at `https://relational-data.org/dataset/Sakila`, lists all tables on the database, and closes the connection. The database represents a fictional movie rental business and includes tables describing films, actors, customers, stores, etc.: ```{r} library(DBI) con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListTables(con) dbDisconnect(con) ``` Connections to databases are created using the `dbConnect()` function. The first argument to the function is the driver for the DBMS you are connecting to. In the example above we are connecting to a MariaDB instance, so we use the `RMariaDB::MariaDB()` driver. The other arguments depend on the authentication required by the DBMS. In the example host, port, username, password, and dbname are required. See the documentation for the DBMS driver package that you are using for specifics. The function `dbListTables()` takes a database connection as its only argument and returns a character vector with all table and view names in the database. After completing a session with a DBMS, always release the connection with a call to `dbDisconnect()`. ### Secure password storage The above example contains the password in the code, which should be avoided for databases with secured access. One way to use the credentials securely is to store it in your system's credential store and then query it with the [keyring](https://github.com/r-lib/keyring#readme) package. The code to connect to the database could then look like this: ```{r eval = FALSE} con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = keyring::key_get("relational.fel.cvut.cz", "guest"), dbname = "sakila" ) ``` ## How to retrieve column names for a table We can list the column names for a table with the function `dbListFields()`. It takes as arguments a database connection and a table name and returns a character vector of the column names in order. ```{r} con <- dbConnect( RMariaDB::MariaDB(), host = "relational.fel.cvut.cz", port = 3306, username = "guest", password = "ctu-relational", dbname = "sakila" ) dbListFields(con, "film") ``` ## Read a table into a data frame The function `dbReadTable()` reads an entire table and returns it as a data frame. It is equivalent to the SQL query `SELECT * FROM `. The columns of the returned data frame share the same names as the columns in the table. DBI and the database backends do their best to coerce data to equivalent R data types. ```{r} df <- dbReadTable(con, "film") head(df, 3) ``` ## Read only selected rows and columns into a data frame To read a subset of the data in a table into a data frame, DBI provides functions to run custom SQL queries and manage the results. For small datasets where you do not need to manage the number of results being returned, the function `dbGetQuery()` takes a SQL `SELECT` query to execute and returns a data frame. Below is a basic query that specifies the columns we require (`film_id`, `title` and `description`) and which rows (records) we are interested in. Here we retrieve films released in the year 2006. ```{r} df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006") head(df, 3) ``` We could also retrieve movies released in 2006 that are rated "G". Note that character strings must be quoted. As the query itself is contained within double quotes, we use single quotes around the rating. See `dbQuoteLiteral()` for programmatically converting arbitrary R values to SQL. This is covered in more detail in `vignette("DBI-advanced", package = "DBI")`. ```{r} df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006 AND rating = 'G'") head(df, 3) ``` The equivalent operation using `dplyr` reconstructs the SQL query using three functions to specify the table (`tbl()`), the subset of the rows (`filter()`), and the columns we require (`select()`). Note that dplyr takes care of the quoting. ```{r message=FALSE} library(dplyr) lazy_df <- tbl(con, "film") %>% filter(release_year == 2006 & rating == "G") %>% select(film_id, title, description) head(lazy_df, 3) ``` If you want to perform other data manipulation queries such as `UPDATE`s and `DELETE`s, see `dbSendStatement()` in `vignette("DBI-advanced", package = "DBI")`. ## How to end a DBMS session When finished accessing the DBMS, always close the connection using `dbDisconnect()`. ```{r} dbDisconnect(con) ``` ## Conclusion This tutorial has given you the basic techniques for accessing data in any supported DBMS. If you need to work with databases that will not fit in memory, or want to run more complex queries, including parameterized queries, please see `vignette("DBI-advanced", package = "DBI")`. ## Further Reading * An overview on [working with databases in R on Rstudio.com](https://db.rstudio.com/) * The DBI specification: `vignette("spec", package = "DBI")` * [List of supported DBMS](https://github.com/r-dbi/backends#readme) DBI/inst/doc/DBI.html0000644000176200001440000006375615147357127013713 0ustar liggesusers Introduction to DBI

Introduction to DBI

James Wondrasek, Katharina Brunner, Kirill Müller

27 February 2020

Who this tutorial is for

This tutorial is for you if you want to access or manipulate data in a database that may be on your machine or on a different computer on the internet, and you have found libraries that use a higher level of abstraction, such as dbplyr, are not suitable for your purpose. Depending on what you want to achieve, you may find it useful to have an understanding of SQL before using DBI.

The DBI (DataBase Interface) package provides a simple, consistent interface between R and database management systems (DBMS). Each supported DBMS is supported by its own R package that implements the DBI specification in vignette("spec", package = "DBI").

DBI currently supports about 30 DBMS, including:

For a more complete list of supported DBMS visit https://github.com/r-dbi/backends. You may need to install the package specific to your DBMS.

The functionality currently supported for each of these DBMS’s includes:

  • manage a connection to a database
  • list the tables in a database
  • list the column names in a table
  • read a table into a data frame

For more advanced features, such as parameterized queries, transactions, and more see vignette("DBI-advanced", package = "DBI").

How to connect to a database using DBI

The following code establishes a connection to the Sakila database hosted by the Relational Dataset Repository at https://relational-data.org/dataset/Sakila, lists all tables on the database, and closes the connection. The database represents a fictional movie rental business and includes tables describing films, actors, customers, stores, etc.:

library(DBI)

con <- dbConnect(
  RMariaDB::MariaDB(),
  host = "relational.fel.cvut.cz",
  port = 3306,
  username = "guest",
  password = "ctu-relational",
  dbname = "sakila"
)

dbListTables(con)
##  [1] "country"       "city"          "customer"      "address"      
##  [5] "film_actor"    "store"         "film_category" "inventory"    
##  [9] "actor"         "film_text"     "payment"       "category"     
## [13] "film"          "rental"        "language"      "staff"
dbDisconnect(con)

Connections to databases are created using the dbConnect() function. The first argument to the function is the driver for the DBMS you are connecting to. In the example above we are connecting to a MariaDB instance, so we use the RMariaDB::MariaDB() driver. The other arguments depend on the authentication required by the DBMS. In the example host, port, username, password, and dbname are required. See the documentation for the DBMS driver package that you are using for specifics.

The function dbListTables() takes a database connection as its only argument and returns a character vector with all table and view names in the database.

After completing a session with a DBMS, always release the connection with a call to dbDisconnect().

Secure password storage

The above example contains the password in the code, which should be avoided for databases with secured access. One way to use the credentials securely is to store it in your system’s credential store and then query it with the keyring package. The code to connect to the database could then look like this:

con <- dbConnect(
  RMariaDB::MariaDB(),
  host = "relational.fel.cvut.cz",
  port = 3306,
  username = "guest",
  password = keyring::key_get("relational.fel.cvut.cz", "guest"),
  dbname = "sakila"
)

How to retrieve column names for a table

We can list the column names for a table with the function dbListFields(). It takes as arguments a database connection and a table name and returns a character vector of the column names in order.

con <- dbConnect(
  RMariaDB::MariaDB(),
  host = "relational.fel.cvut.cz",
  port = 3306,
  username = "guest",
  password = "ctu-relational",
  dbname = "sakila"
)
dbListFields(con, "film")
##  [1] "film_id"              "title"                "description"         
##  [4] "release_year"         "language_id"          "original_language_id"
##  [7] "rental_duration"      "rental_rate"          "length"              
## [10] "replacement_cost"     "rating"               "special_features"    
## [13] "last_update"

Read a table into a data frame

The function dbReadTable() reads an entire table and returns it as a data frame. It is equivalent to the SQL query SELECT * FROM <name>. The columns of the returned data frame share the same names as the columns in the table. DBI and the database backends do their best to coerce data to equivalent R data types.

df <- dbReadTable(con, "film")
head(df, 3)
##   film_id            title
## 1       1 ACADEMY DINOSAUR
## 2       2   ACE GOLDFINGER
## 3       3 ADAPTATION HOLES
##                                                                                            description
## 1     A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies
## 2 A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 3     A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory
##   release_year language_id original_language_id rental_duration rental_rate
## 1         2006           1                   NA               6        0.99
## 2         2006           1                   NA               3        4.99
## 3         2006           1                   NA               7        2.99
##   length replacement_cost rating                 special_features
## 1     86            20.99     PG Deleted Scenes,Behind the Scenes
## 2     48            12.99      G          Trailers,Deleted Scenes
## 3     50            18.99  NC-17          Trailers,Deleted Scenes
##           last_update
## 1 2006-02-15 04:03:42
## 2 2006-02-15 04:03:42
## 3 2006-02-15 04:03:42

Read only selected rows and columns into a data frame

To read a subset of the data in a table into a data frame, DBI provides functions to run custom SQL queries and manage the results. For small datasets where you do not need to manage the number of results being returned, the function dbGetQuery() takes a SQL SELECT query to execute and returns a data frame. Below is a basic query that specifies the columns we require (film_id, title and description) and which rows (records) we are interested in. Here we retrieve films released in the year 2006.

df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006")
head(df, 3)
##   film_id            title
## 1       1 ACADEMY DINOSAUR
## 2       2   ACE GOLDFINGER
## 3       3 ADAPTATION HOLES
##                                                                                            description
## 1     A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies
## 2 A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 3     A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory

We could also retrieve movies released in 2006 that are rated “G�. Note that character strings must be quoted. As the query itself is contained within double quotes, we use single quotes around the rating. See dbQuoteLiteral() for programmatically converting arbitrary R values to SQL. This is covered in more detail in vignette("DBI-advanced", package = "DBI").

df <- dbGetQuery(con, "SELECT film_id, title, description FROM film WHERE release_year = 2006 AND rating = 'G'")
head(df, 3)
##   film_id            title
## 1       2   ACE GOLDFINGER
## 2       4 AFFAIR PREJUDICE
## 3       5      AFRICAN EGG
##                                                                                                             description
## 1                  A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China
## 2                          A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank
## 3 A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico

The equivalent operation using dplyr reconstructs the SQL query using three functions to specify the table (tbl()), the subset of the rows (filter()), and the columns we require (select()). Note that dplyr takes care of the quoting.

library(dplyr)

lazy_df <-
  tbl(con, "film") %>%
  filter(release_year == 2006 & rating == "G") %>%
  select(film_id, title, description)
head(lazy_df, 3)
## # Source:   SQL [?? x 3]
## # Database: mysql  [guest@relational.fel.cvut.cz:3306/sakila]
##   film_id title            description                                          
##     <int> <chr>            <chr>                                                
## 1       2 ACE GOLDFINGER   A Astounding Epistle of a Database Administrator And…
## 2       4 AFFAIR PREJUDICE A Fanciful Documentary of a Frisbee And a Lumberjack…
## 3       5 AFRICAN EGG      A Fast-Paced Documentary of a Pastry Chef And a Dent…

If you want to perform other data manipulation queries such as UPDATEs and DELETEs, see dbSendStatement() in vignette("DBI-advanced", package = "DBI").

How to end a DBMS session

When finished accessing the DBMS, always close the connection using dbDisconnect().

dbDisconnect(con)

Conclusion

This tutorial has given you the basic techniques for accessing data in any supported DBMS. If you need to work with databases that will not fit in memory, or want to run more complex queries, including parameterized queries, please see vignette("DBI-advanced", package = "DBI").

Further Reading

DBI/inst/doc/DBI-proposal.Rmd0000644000176200001440000006635215143057347015316 0ustar liggesusers--- title: "A Common Interface to Relational Databases from R and S -- A Proposal" author: "David James" date: "March 16, 2000" output: rmarkdown::html_vignette bibliography: biblio.bib vignette: > %\VignetteIndexEntry{A Common Interface to Relational Databases from R and S -- A Proposal} %\VignetteEngine{knitr::rmarkdown} --- For too long S and similar data analysis environments have lacked good interfaces to relational database systems (RDBMS). For the last twenty years or so these RDBMS have evolved into highly optimized client-server systems for data storage and manipulation, and currently they serve as repositories for most of the business, industrial, and research “raw� data that analysts work with. Other analysis packages, such as SAS, have traditionally provided good data connectivity, but S and GNU R have relied on intermediate text files as means of importing data (but see @R.imp-exp and @R-dbms.) Although this simple approach works well for relatively modest amounts of mostly static data, it does not scale up to larger amounts of data distributed over machines and locations, nor does it scale up to data that is highly dynamic – situations that are becoming increasingly common. We want to propose a common interface between R/S and RDBMS that would allow users to access data stored on database servers in a uniform and predictable manner irrespective of the database engine. The interface defines a small set of classes and methods similar in spirit to Python’s DB-API, Java’s JDBC, Microsoft’s ODBC, Perl’s DBI, etc., but it conforms to the “whole-object� philosophy so natural in S and R. # Computing with Distributed Data {#sec:distr} As data analysts, we are increasingly faced with the challenge of larger data sources distributed over machines and locations; most of these data sources reside in relational database management systems (RDBMS). These relational databases represent a mature client-server distributed technology that we as analysts could be exploiting more that we’ve done in the past. The relational technology provides a well-defined standard, the ANSI SQL-92 @sql92, both for defining and manipulating data in a highly optimized fashion from virtually any application. In contrast, S and Splus have provided somewhat limited tools for coping with the challenges of larger and distributed data sets (Splus does provide an `import` function to import from databases, but it is quite limited in terms of SQL facilities). The R community has been more resourceful and has developed a number of good libraries for connecting to mSQL, MySQL, PostgreSQL, and ODBC; each library, however, has defined its own interface to each database engine a bit differently. We think it would be to everybody’s advantage to coordinate the definition of a common interface, an effort not unlike those taken in the Python and Perl communities. The goal of a common, seamless access to distributed data is a modest one in our evolution towards a fully distributed computing environment. We recognize the greater goal of distributed computing as the means to fully integrate diverse systems – not just databases – into a truly flexible analysis environment. Good connectivity to databases, however, is of immediate necessity both in practical terms and as a means to help us transition from monolithic, self-contained systems to those in which computations, not only the data, can be carried out in parallel over a wide number of computers and/or systems @duncan2000. Issues of reliability, security, location transparency, persistence, etc., will be new to most of us and working with distributed data may provide a more gradual change to ease in the ultimate goal of full distributed computing. # A Common Interface {#sec:rs-dbi} We believe that a common interface to databases can help users easily access data stored in RDBMS. A common interface would describe, in a uniform way, how to connect to RDBMS, extract meta-data (such as list of available databases, tables, etc.) as well as a uniform way to execute SQL statements and import their output into R and S. The current emphasis is on querying databases and not so much in a full low-level interface for database development as in JDBC or ODBC, but unlike these, we want to approach the interface from the “whole-object� perspective @S4 so natural to R/S and Python – for instance, by fetching all fields and records simultaneously into a single object. The basic idea is to split the interface into a front-end consisting of a few classes and generic functions that users invoke and a back-end set of database-specific classes and methods that implement the actual communication. (This is a very well-known pattern in software engineering, and another good verbatim is the device-independent graphics in R/S where graphics functions produce similar output on a variety of different devices, such X displays, Postscript, etc.) The following verbatim shows the front-end: ``` > mgr <- dbManager("Oracle") > con <- dbConnect(mgr, user = "user", passwd = "passwd") > rs <- dbExecStatement(con, "select fld1, fld2, fld3 from MY_TABLE") > tbls <- fetch(rs, n = 100) > hasCompleted(rs) [1] T > close(rs) > rs <- dbExecStatement(con, "select id_name, q25, q50 from liv2") > res <- fetch(rs) > getRowCount(rs) [1] 73 > close(con) ``` Such scripts should work with other RDBMS (say, MySQL) by replacing the first line with ``` > mgr <- dbManager("MySQL") ``` ## Interface Classes {#sec:rs-dbi-classes} The following are the main RS-DBI classes. They need to be extended by individual database back-ends (MySQL, Oracle, etc.) `dbManager` : Virtual class[^2] extended by actual database managers, e.g., Oracle, MySQL, Informix. `dbConnection` : Virtual class that captures a connection to a database instance[^3]. `dbResult` : Virtual class that describes the result of an SQL statement. `dbResultSet` : Virtual class, extends `dbResult` to fully describe the output of those statements that produce output records, i.e., `SELECT` (or `SELECT`-like) SQL statement. All these classes should implement the methods `show`, `describe`, and `getInfo`: `show` : (`print` in R) prints a one-line identification of the object. `describe` : prints a short summary of the meta-data of the specified object (like `summary` in R/S). `getInfo` : takes an object of one of the above classes and a string specifying a meta-data item, and it returns the corresponding information (`NULL` if unavailable). > mgr <- dbManager("MySQL") > getInfo(mgr, "version") > con <- dbConnect(mgr, ...) > getInfo(con, "type") The reason we implement the meta-data through `getInfo` in this way is to simplify the writing of database back-ends. We don’t want to overwhelm the developers of drivers (ourselves, most likely) with hundreds of methods as in the case of JDBC. In addition, the following methods should also be implemented: `getDatabases` : lists all available databases known to the `dbManager`. `getTables` : lists tables in a database. `getTableFields` : lists the fields in a table in a database. `getTableIndices` : lists the indices defined for a table in a database. These methods may be implemented using the appropriate `getInfo` method above. In the next few sections we describe in detail each of these classes and their methods. ### Class `dbManager` {#sec:dbManager} This class identifies the relational database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The `dbManager` class defines the following methods: `load` : initializes the driver code. We suggest having the generator, `dbManager(driver)`, automatically load the driver. `unload` : releases whatever resources the driver is using. `getVersion` : returns the version of the RS-DBI currently implemented, plus any other relevant information about the implementation itself and the RDBMS being used. ### Class `dbConnection` {#sec:dbConnection} This virtual class captures a connection to a RDBMS, and it provides access to dynamic SQL, result sets, RDBMS session management (transactions), etc. Note that the `dbManager` may or may not allow multiple simultaneous connections. The methods it defines include: `dbConnect` : opens a connection to the database `dbname`. Other likely arguments include `host`, `user`, and `password`. It returns an object that extends `dbConnection` in a driver-specific manner (e.g., the MySQL implementation creates a connection of class `MySQLConnection` that extends `dbConnection`). Note that we could separate the steps of connecting to a RDBMS and opening a database there (i.e., opening an *instance*). For simplicity we do the 2 steps in this method. If the user needs to open another instance in the same RDBMS, just open a new connection. `close` : closes the connection and discards all pending work. `dbExecStatement` : submits one SQL statement. It returns a `dbResult` object, and in the case of a `SELECT` statement, the object also inherits from `dbResultSet`. This `dbResultSet` object is needed for fetching the output rows of `SELECT` statements. The result of a non-`SELECT` statement (e.g., `UPDATE, DELETE, CREATE, ALTER`, ...) is defined as the number of rows affected (this seems to be common among RDBMS). `commit` : commits pending transaction (optional). `rollback` : undoes current transaction (optional). `callProc` : invokes a stored procedure in the RDBMS (tentative). Stored procedures are *not* part of the ANSI SQL-92 standard and possibly vary substantially from one RDBMS to another. For instance, Oracle seems to have a fairly decent implementation of stored procedures, but MySQL currently does not support them. `dbExec` : submit an SQL “script� (multiple statements). May be implemented by looping with `dbExecStatement`. `dbNextResultSet` : When running SQL scripts (multiple statements), it closes the current result set in the `dbConnection`, executes the next statement and returns its result set. ### Class `dbResult` {#sec:dbResult} This virtual class describes the result of an SQL statement (any statement) and the state of the operation. Non-query statements (e.g., `CREATE`, `UPDATE`, `DELETE`) set the “completed� state to 1, while `SELECT` statements to 0. Error conditions set this slot to a negative number. The `dbResult` class defines the following methods: `getStatement` : returns the SQL statement associated with the result set. `getDBConnection` : returns the `dbConnection` associated with the result set. `getRowsAffected` : returns the number of rows affected by the operation. `hasCompleted` : was the operation completed? `SELECT`’s, for instance, are not completed until their output rows are all fetched. `getException` : returns the status of the last SQL statement on a given connection as a list with two members, status code and status description. ### Class `dbResultSet` {#sec:dbResultSet} This virtual class extends `dbResult`, and it describes additional information from the result of a `SELECT` statement and the state of the operation. The `completed` state is set to 0 so long as there are pending rows to fetch. The `dbResultSet` class defines the following additional methods: `getRowCount` : returns the number of rows fetched so far. `getNullOk` : returns a logical vector with as many elements as there are fields in the result set, each element describing whether the corresponding field accepts `NULL` values. `getFields` : describes the `SELECT`ed fields. The description includes field names, RDBMS internal data types, internal length, internal precision and scale, null flag (i.e., column allows `NULL`’s), and corresponding S classes (which can be over-ridden with user-provided classes). The current MySQL and Oracle implementations define a `dbResultSet` as a named list with the following elements: `connection`: : the connection object associated with this result set; `statement`: : a string with the SQL statement being processed; `description`: : a field description `data.frame` with as many rows as there are fields in the `SELECT` output, and columns specifying the `name`, `type`, `length`, `precision`, `scale`, `Sclass` of the corresponding output field. `rowsAffected`: : the number of rows that were affected; `rowCount`: : the number of rows so far fetched; `completed`: : a logical value describing whether the operation has completed or not. `nullOk`: : a logical vector specifying whether the corresponding column may take NULL values. The methods above are implemented as accessor functions to this list in the obvious way. `setDataMappings` : defines a conversion between internal RDBMS data types and R/S classes. We expect the default mappings to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. (See Section [sec:mappings] for details.) `close` : closes the result set and frees resources both in R/S and the RDBMS. `fetch` : extracts the next `max.rec` records (-1 means all). ## Data Type Mappings {#sec:mappings} The data types supported by databases are slightly different than the data types in R and S, but the mapping between them is straightforward: Any of the many fixed and varying length character types are mapped to R/S `character`. Fixed-precision (non-IEEE) numbers are mapped into either doubles (`numeric`) or long (`integer`). Dates are mapped to character using the appropriate `TO_CHAR` function in the RDBMS (which should take care of any locale information). Some RDBMS support the type `CURRENCY` or `MONEY` which should be mapped to `numeric`. Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion as follows: 1. run the query (either with `dbExec` or `dbExecStatement`): > rs <- dbExecStatement(con, "select whatever-You-need") 2. extract the output field definitions > flds <- getFields(rs) 3. replace the class generator in the, say 3rd field, by the user own generator: > flds[3, "Sclass"] # default mapping [1] "character" by > flds[3, "Sclass"] <- "myOwnGeneratorFunction" 4. set the new data mapping prior to fetching > setDataMappings(resutlSet, flds) 5. fetch the rows and store in a `data.frame` > data <- fetch(resultSet) ## Open Issues {#sec:open-issues} We may need to provide some additional utilities, for instance to convert dates, to escape characters such as quotes and slashes in query strings, to strip excessive blanks from some character fields, etc. We need to decide whether we provide hooks so these conversions are done at the C level, or do all the post-processing in R or S. Another issue is what kind of data object is the output of an SQL query. Currently the MySQL and Oracle implementations return data as a `data.frame`; data frames have the slight inconvenience that they automatically re-label the fields according to R/S syntax, changing the actual RDBMS labels of the variables; the issue of non-numeric data being coerced into factors automatically “at the drop of a hat� (as someone in s-news wrote) is also annoying. The execution of SQL scripts is not fully described. The method that executes scripts could run individual statements without returning until it encounters a query (`SELECT`-like) statement. At that point it could return that one result set. The application is then responsible for fetching these rows, and then for invoking `dbNextResultSet` on the opened `dbConnection` object to repeat the `dbExec`/`fetch` loop until it encounters the next `dbResultSet`. And so on. Another (potentially very expensive) alternative would be to run all statements sequentially and return a list of `data.frame`s, each element of the list storing the result of each statement. Binary objects and large objects present some challenges both to R and S. It is becoming more common to store images, sounds, and other data types as binary objects in RDBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects – perhaps tentatively not in full generality. Large objects could be fetched by repeatedly invoking a specified R/S function that takes as argument chunks of a specified number of raw bytes. In the case of S4 (and Splus5.x) the RS-DBI implementation can write into an opened connection for which the user has defined a reader (but can we guarantee that we won’t overflow the connection?). In the case of R it is not clear what data type binary large objects (BLOB) should be mapped into. ## Limitations {#sec:limitations} These are some of the limitations of the current interface definition: - we only allow one SQL statement at a time, forcing users to split SQL scripts into individual statements; - transaction management is not fully described; - the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define “bind variables�; this is a mechanism by which the contents of S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement /* SQL */ SELECT * from emp_table where emp_id = :sampleEmployee would take the vector `sampleEmployee` and iterate over each of its elements to get the result. Perhaps RS-DBI could at some point in the future implement this feature. # Other Approaches The high-level, front-end description of RS-DBI is the more critical aspect of the interface. Details on how to actually implement this interface may change over time. The approach described in this document based on one back-end driver per RDBMS is reasonable, but not the only approach – we simply felt that a simpler approach based on well-understood and self-contained tools (R, S, and C API’s) would be a better start. Nevertheless we want to briefly mention a few alternatives that we considered and tentatively decided against, but may quite possibly re-visit in the near future. ## Open Database Connectivity (ODBC) {#sec:odbc} The ODBC protocol was developed by Microsoft to allow connectivity among C/C++ applications and RDBMS. As you would expect, originally implementations of the ODBC were only available under Windows environments. There are various effort to create a Unix implementation (see [the Unix ODBC](https://www.unixodbc.org/) web-site and @odbc.lj). This approach looks promising because it allows us to write only one back-end, instead of one per RDBMS. Since most RDBMS already provide ODBC drivers, this could greatly simplify development. Unfortunately, the Unix implementation of ODBC was not mature enough at the time we looked at it, a situation we expect will change in the next year or so. At that point we will need to re-evaluate it to make sure that such an ODBC interface does not penalize the interface in terms of performance, ease of use, portability among the various Unix versions, etc. ## Java Database Connectivity (JDBC) {#sec:jdbc} Another protocol, the Java database connectivity, is very well-done and supported by just about every RDBMS. The issue with JDBC is that as of today neither S nor R (which are written in C) interfaces cleanly with Java. There are several efforts (some in a quite fairly advanced state) to allow S and R to invoke Java methods. Once this interface is widely available in Splus5x and R we will need to re-visit this issue again and study the performance, usability, etc., of JDBC as a common back-end to the RS-DBI. ## CORBA and a 3-tier Architecture {#sec:corba} Yet another approach is to move the interface to RDBMS out of R and S altogether into a separate system or server that would serve as a proxy between R/S and databases. The communication to this middle-layer proxy could be done through CORBA [@s-corba.98, @corba:siegel.96], Java’s RMI, or some other similar technology. Such a design could be very flexible, but the CORBA facilities both in R and S are not widely available yet, and we do not know whether this will be made available to Splus5 users from MathSoft. Also, my experience with this technology is rather limited. On the other hand, this 3-tier architecture seem to offer the most flexibility to cope with very large distributed databases, not necessarily relational. # Resources {#sec:resources} The latest documentation and software on the RS-DBI was available at www.omegahat.net (link dead now: `https://www.omegahat.net/contrib/RS-DBI/index.html`). The R community has developed interfaces to some databases: [RmSQL](https://cran.r-project.org/src/contrib/Archive/RmSQL/) is an interface to the [mSQL](https://www.hughes.com.au/) database written by Torsten Hothorn; [RPgSQL](https://keittlab.org) is an interface to [PostgreSQL](https://www.postgreSQL.org) and was written by Timothy H. Keitt; [RODBC](https://www.stats.ox.ac.uk/pub/bdr/) is an interface to ODBC, and it was written by [Michael Lapsley](mailto:mlapsley@sthelier.sghms.ac.uk). (For more details on all these see @R.imp-exp.) The are R and S-Plus interfaces to [MySQL](https://dev.mysql.com/) that follow the propose RS-DBI API described here; also, there’s an S-Plus interface SOracle @RS-Oracle to Oracle (we expect to have an R implementation soon.) The idea of a common interface to databases has been successfully implemented in Java’s Database Connectivity (JDBC) ([www.javasoft.com](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/)), in C through the Open Database Connectivity (ODBC) ([www.unixodbc.org](https://www.unixodbc.org/)), in Python’s Database Application Programming Interface ([www.python.org](https://www.python.org)), and in Perl’s Database Interface ([www.cpan.org](https://www.cpan.org)). # Acknowledgements The R/S database interface came about from suggestions, comments, and discussions with [John M. Chambers](mailto:jmc@research.bell-labs.com) and [Duncan Temple Lang](mailto:duncan@research.bell-labs.com) in the context of the Omega Project for Statistical Computing. [Doug Bates](mailto:bates@stat.wisc.edu) and [Saikat DebRoy](mailto:saikat@stat.wisc.edu) ported (and greatly improved) the first MySQL implementation to R. # The S Version 4 Definitions The following code is meant to serve as a detailed description of the R/S to database interface. We decided to use S4 (instead of R or S version 3) because its clean syntax help us to describe easily the classes and methods that form the RS-DBI, and also to convey the inter-class relationships. ```R ## Define all the classes and methods to be used by an ## implementation of the RS-DataBase Interface. Mostly, ## these classes are virtual and each driver should extend ## them to provide the actual implementation. ## Class: dbManager ## This class identifies the DataBase Management System ## (Oracle, MySQL, Informix, PostgreSQL, etc.) setClass("dbManager", VIRTUAL) setGeneric("load", def = function(dbMgr,...) standardGeneric("load") ) setGeneric("unload", def = function(dbMgr,...) standardGeneric("unload") ) setGeneric("getVersion", def = function(dbMgr,...) standardGeneric("getVersion") ) ## Class: dbConnections ## This class captures a connection to a database instance. setClass("dbConnection", VIRTUAL) setGeneric("dbConnection", def = function(dbMgr, ...) standardGeneric("dbConnection") ) setGeneric("dbConnect", def = function(dbMgr, ...) standardGeneric("dbConnect") ) setGeneric("dbExecStatement", def = function(con, statement, ...) standardGeneric("dbExecStatement") ) setGeneric("dbExec", def = function(con, statement, ...) standardGeneric("dbExec") ) setGeneric("getResultSet", def = function(con, ..) standardGeneric("getResultSet") ) setGeneric("commit", def = function(con, ...) standardGeneric("commit") ) setGeneric("rollback", def = function(con, ...) standardGeneric("rollback") ) setGeneric("callProc", def = function(con, ...) standardGeneric("callProc") ) setMethod("close", signature = list(con="dbConnection", type="missing"), def = function(con, type) NULL ) ## Class: dbResult ## This is a base class for arbitrary results from the RDBMS ## (INSERT, UPDATE, DELETE). SELECTs (and SELECT-like) ## statements produce "dbResultSet" objects, which extend ## dbResult. setClass("dbResult", VIRTUAL) setMethod("close", signature = list(con="dbResult", type="missing"), def = function(con, type) NULL ) ## Class: dbResultSet ## Note that we define a resultSet as the result of a ## SELECT SQL statement. setClass("dbResultSet", "dbResult") setGeneric("fetch", def = function(resultSet,n,...) standardGeneric("fetch") ) setGeneric("hasCompleted", def = function(object, ...) standardGeneric("hasCompleted") ) setGeneric("getException", def = function(object, ...) standardGeneric("getException") ) setGeneric("getDBconnection", def = function(object, ...) standardGeneric("getDBconnection") ) setGeneric("setDataMappings", def = function(resultSet, ...) standardGeneric("setDataMappings") ) setGeneric("getFields", def = function(object, table, dbname, ...) standardGeneric("getFields") ) setGeneric("getStatement", def = function(object, ...) standardGeneric("getStatement") ) setGeneric("getRowsAffected", def = function(object, ...) standardGeneric("getRowsAffected") ) setGeneric("getRowCount", def = function(object, ...) standardGeneric("getRowCount") ) setGeneric("getNullOk", def = function(object, ...) standardGeneric("getNullOk") ) ## Meta-data: setGeneric("getInfo", def = function(object, ...) standardGeneric("getInfo") ) setGeneric("describe", def = function(object, verbose=F, ...) standardGeneric("describe") ) setGeneric("getCurrentDatabase", def = function(object, ...) standardGeneric("getCurrentDatabase") ) setGeneric("getDatabases", def = function(object, ...) standardGeneric("getDatabases") ) setGeneric("getTables", def = function(object, dbname, ...) standardGeneric("getTables") ) setGeneric("getTableFields", def = function(object, table, dbname, ...) standardGeneric("getTableFields") ) setGeneric("getTableIndices", def = function(object, table, dbname, ...) standardGeneric("getTableIndices") ) ``` [^2]: A virtual class allows us to group classes that share some common functionality, e.g., the virtual class “`dbConnection`� groups all the connection implementations by Informix, Ingres, DB/2, Oracle, etc. Although the details will vary from one RDBMS to another, the defining characteristic of these objects is what a virtual class captures. R and S version 3 do not explicitly define virtual classes, but they can easily implement the idea through inheritance. [^3]: The term “database� is sometimes (confusingly) used both to denote the RDBMS, such as Oracle, MySQL, and also to denote a particular database instance under a RDBMS, such as “opto� or “sales� databases under the same RDBMS. DBI/inst/doc/backend.Rmd0000644000176200001440000002413615005150137014430 0ustar liggesusers --- title: "Implementing a new backend" author: "Hadley Wickham, Kirill Müller" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Implementing a new backend} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r, echo = FALSE} library(DBI) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` The goal of this document is to help you implement a new backend for DBI. If you are writing a package that connects a database to R, I highly recommend that you make it DBI compatible because it makes your life easier by spelling out exactly what you need to do. The consistent interface provided by DBI makes it easier for you to implement the package (because you have fewer arbitrary choices to make), and easier for your users (because it follows a familiar pattern). In addition, the `DBItest` package provides test cases which you can easily incorporate in your package. I'll illustrate the process using a fictional database called Kazam. ## Getting started Start by creating a package. It's up to you what to call the package, but following the existing pattern of `RSQLite`, `RMySQL`, `RPostgres` and `ROracle` will make it easier for people to find it. For this example, I'll call my package `RKazam`. A ready-to-use template package is available at https://github.com/r-dbi/RKazam/. You can start by creating a new GitHub repository from this template, or by copying the package code. Rename "Kazam" to your desired name everywhere. The template package already contains dummy implementations for all classes and methods. If you chose to create the package manually, make sure to include in your `DESCRIPTION`: ```yaml Imports: DBI (>= 0.3.0), methods Suggests: DBItest, testthat ``` Importing `DBI` is fine, because your users are not supposed to *attach* your package anyway; the preferred method is to attach `DBI` and use explicit qualification via `::` to access the driver in your package (which needs to be done only once). ## Testing Why testing at this early stage? Because testing should be an integral part of the software development cycle. Test right from the start, add automated tests as you go, finish faster (because tests are automated) while maintaining superb code quality (because tests also check corner cases that you might not be aware of). Don't worry: if some test cases are difficult or impossible to satisfy, or take too long to run, you can just turn them off. Take the time now to head over to the `DBItest` vignette at `vignette("test", package = "DBItest")`. You will find a vast amount of ready-to-use test cases that will help you in the process of implementing your new DBI backend. Add custom tests that are not covered by `DBItest` at your discretion, or enhance `DBItest` and file a pull request if the test is generic enough to be useful for many DBI backends. ## Driver Start by making a driver class which inherits from `DBIDriver`. This class doesn't need to do anything, it's just used to dispatch other generics to the right method. Users don't need to know about this, so you can remove it from the default help listing with `@keywords internal`: ```{r} #' Driver for Kazam database. #' #' @keywords internal #' @export #' @import DBI #' @import methods setClass("KazamDriver", contains = "DBIDriver") ``` The driver class was more important in older versions of DBI, so you should also provide a dummy `dbUnloadDriver()` method. ```{r} #' @export #' @rdname Kazam-class setMethod("dbUnloadDriver", "KazamDriver", function(drv, ...) { TRUE }) ``` If your package needs global setup or tear down, do this in the `.onLoad()` and `.onUnload()` functions. You might also want to add a show method so the object prints nicely: ```{r} setMethod("show", "KazamDriver", function(object) { cat("\n") }) ``` Next create `Kazam()` which instantiates this class. ```{r} #' @export Kazam <- function() { new("KazamDriver") } Kazam() ``` ## Connection Next create a connection class that inherits from `DBIConnection`. This should store all the information needed to connect to the database. If you're talking to a C api, this will include a slot that holds an external pointer. ```{r} #' Kazam connection class. #' #' @export #' @keywords internal setClass("KazamConnection", contains = "DBIConnection", slots = list( host = "character", username = "character", # and so on ptr = "externalptr" ) ) ``` Now you have some of the boilerplate out of the way, you can start work on the connection. The most important method here is `dbConnect()` which allows you to connect to a specified instance of the database. Note the use of `@rdname Kazam`. This ensures that `Kazam()` and the connect method are documented together. ```{r} #' @param drv An object created by \code{Kazam()} #' @rdname Kazam #' @export #' @examples #' \dontrun{ #' db <- dbConnect(RKazam::Kazam()) #' dbWriteTable(db, "mtcars", mtcars) #' dbGetQuery(db, "SELECT * FROM mtcars WHERE cyl == 4") #' } setMethod("dbConnect", "KazamDriver", function(drv, ...) { # ... new("KazamConnection", host = host, ...) }) ``` * Replace `...` with the arguments needed to connect to your database. You'll always need to include `...` in the arguments, even if you don't use it, for compatibility with the generic. * This is likely to be where people first come for help, so the examples should show how to connect to the database, and how to query it. (Obviously these examples won't work yet.) Ideally, include examples that can be run right away (perhaps relying on a publicly hosted database), but failing that surround in `\dontrun{}` so people can at least see the code. Next, implement `show()` and `dbDisconnect()` methods. ## Results Finally, you're ready to implement the meat of the system: fetching results of a query into a data frame. First define a results class: ```{r} #' Kazam results class. #' #' @keywords internal #' @export setClass("KazamResult", contains = "DBIResult", slots = list(ptr = "externalptr") ) ``` Then write a `dbSendQuery()` method. This takes a connection and SQL string as arguments, and returns a result object. Again `...` is needed for compatibility with the generic, but you can add other arguments if you need them. ```{r} #' Send a query to Kazam. #' #' @export #' @examples #' # This is another good place to put examples setMethod("dbSendQuery", "KazamConnection", function(conn, statement, ...) { # some code new("KazamResult", ...) }) ``` Next, implement `dbClearResult()`, which should close the result set and free all resources associated with it: ```{r} #' @export setMethod("dbClearResult", "KazamResult", function(res, ...) { # free resources TRUE }) ``` The hardest part of every DBI package is writing the `dbFetch()` method. This needs to take a result set and (optionally) number of records to return, and create a dataframe. Mapping R's data types to those of your database may require a custom implementation of the `dbDataType()` method for your connection class: ```{r} #' Retrieve records from Kazam query #' @export setMethod("dbFetch", "KazamResult", function(res, n = -1, ...) { ... }) # (optionally) #' Find the database data type associated with an R object #' @export setMethod("dbDataType", "KazamConnection", function(dbObj, obj, ...) { ... }) ``` Next, implement `dbHasCompleted()` which should return a `logical` indicating if there are any rows remaining to be fetched. ```{r} #' @export setMethod("dbHasCompleted", "KazamResult", function(res, ...) {}) ``` With these four methods in place, you can now use the default `dbGetQuery()` to send a query to the database, retrieve results if available and then clean up. Spend some time now making sure this works with an existing database, or relax and let the `DBItest` package do the work for you. ## SQL methods You're now on the home stretch, and can make your wrapper substantially more useful by implementing methods that wrap around variations in SQL across databases: * `dbQuoteString()` and `dbQuoteIdentifer()` are used to safely quote strings and identifiers to avoid SQL injection attacks. Note that the former must be vectorized, but not the latter. * `dbWriteTable()` creates a database table given an R dataframe. I'd recommend using the functions prefixed with `sql` in this package to generate the SQL. These functions are still a work in progress so please let me know if you have problems. * `dbReadTable()`: a simple wrapper around `SELECT * FROM table`. Use `dbQuoteIdentifer()` to safely quote the table name and prevent mismatches between the names allowed by R and the database. * `dbListTables()` and `dbExistsTable()` let you determine what tables are available. If not provided by your database's API, you may need to generate sql that inspects the system tables. * `dbListFields()` shows which fields are available in a given table. * `dbRemoveTable()` wraps around `DROP TABLE`. Start with `SQL::sqlTableDrop()`. * `dbBegin()`, `dbCommit()` and `dbRollback()`: implement these three functions to provide basic transaction support. This functionality is currently not tested in the `DBItest` package. ## Metadata methods There are a lot of extra metadata methods for result sets (and one for the connection) that you might want to implement. They are described in the following. * `dbIsValid()` returns if a connection or a result set is open (`TRUE`) or closed (`FALSE`). All further methods in this section are valid for result sets only. * `dbGetStatement()` returns the issued query as a character value. * `dbColumnInfo()` lists the names and types of the result set's columns. * `dbGetRowCount()` and `dbGetRowsAffected()` returns the number of rows returned or altered in a `SELECT` or `INSERT`/`UPDATE` query, respectively. * `dbBind()` allows using parametrised queries. Take a look at `sqlInterpolate()` and `sqlParseVariables()` if your SQL engine doesn't offer native parametrised queries. ## Full DBI compliance By now, your package should implement all methods defined in the DBI specification. If you want to walk the extra mile, offer a read-only mode that allows your users to be sure that their valuable data doesn't get destroyed inadvertently. DBI/inst/doc/DBI-arrow.html0000644000176200001440000006203115147357122015017 0ustar liggesusers Using DBI with Arrow

Using DBI with Arrow

Kirill Müller

25/12/2023

Who this tutorial is for

This tutorial is for you if you want to leverage Apache Arrow for accessing and manipulating data on databases. See vignette("DBI", package = "DBI") and vignette("DBI-advanced", package = "DBI") for tutorials on accessing data using R’s data frames instead of Arrow’s structures.

Rationale

Apache Arrow is

a cross-language development platform for in-memory analytics,

suitable for large and huge data, with support for out-of-memory operation. Arrow is also a data exchange format, the data types covered by Arrow align well with the data types supported by SQL databases.

DBI 1.2.0 introduced support for Arrow as a format for exchanging data between R and databases. The aim is to:

  • accelerate data retrieval and loading, by using fewer costly data conversions;
  • better support reading and summarizing data from a database that is larger than memory;
  • provide better type fidelity with workflows centered around Arrow.

This allows existing code to be used with Arrow, and it allows new code to be written that is more efficient and more flexible than code that uses R’s data frames.

The interface is built around the {nanoarrow} R package, with nanoarrow::as_nanoarrow_array and nanoarrow::as_nanoarrow_array_stream as fundamental data structures.

New classes and generics

DBI 1.2.0 introduces new classes and generics for working with Arrow data:

  • dbReadTableArrow()
  • dbWriteTableArrow()
  • dbCreateTableArrow()
  • dbAppendTableArrow()
  • dbGetQueryArrow()
  • dbSendQueryArrow()
  • dbBindArrow()
  • dbFetchArrow()
  • dbFetchArrowChunk()
  • DBIResultArrow-class
  • DBIResultArrowDefault-class

Compatibility is important for DBI, and implementing new generics and classes greatly reduces the risk of breaking existing code. The DBI package comes with a fully functional fallback implementation for all existing DBI backends. The fallback is not improving performance, but it allows existing code to be used with Arrow before switching to a backend with native Arrow support. Backends with native support, like the adbi package, implement the new generics and classes for direct support and improved performance.

In the remainder of this tutorial, we will demonstrate the new generics and classes using the RSQLite package. SQLite is an in-memory database, this code does not need a database server to be installed and running.

Prepare

We start by setting up a database connection and creating a table with some data, using the original dbWriteTable() method.

library(DBI)

con <- dbConnect(RSQLite::SQLite())

data <- data.frame(
  a = 1:3,
  b = 4.5,
  c = "five"
)

dbWriteTable(con, "tbl", data)

Read all rows from a table

The dbReadTableArrow() method reads all rows from a table into an Arrow stream, similarly to dbReadTable(). Arrow objects implement the as.data.frame() method, so we can convert the stream to a data frame.

stream <- dbReadTableArrow(con, "tbl")
stream
## <nanoarrow_array_stream struct<a: int32, b: double, c: string>>
##  $ get_schema:function ()  
##  $ get_next  :function (schema = x$get_schema(), validate = TRUE)  
##  $ release   :function ()
as.data.frame(stream)
##   a   b    c
## 1 1 4.5 five
## 2 2 4.5 five
## 3 3 4.5 five

Run queries

The dbGetQueryArrow() method runs a query and returns the result as an Arrow stream. This stream can be turned into an arrow::RecordBatchReader object and processed further, without bringing it into R.

stream <- dbGetQueryArrow(con, "SELECT COUNT(*) AS n FROM tbl WHERE a < 3")
stream
## <nanoarrow_array_stream struct<n: int32>>
##  $ get_schema:function ()  
##  $ get_next  :function (schema = x$get_schema(), validate = TRUE)  
##  $ release   :function ()
path <- tempfile(fileext = ".parquet")
arrow::write_parquet(arrow::as_record_batch_reader(stream), path)
arrow::read_parquet(path)
## # A data frame: 1 × 1
##       n
## * <int>
## 1     2

Prepared queries

The dbGetQueryArrow() method supports prepared queries, using the params argument which accepts a data frame or a list.

params <- data.frame(a = 3L)
stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params)
as.data.frame(stream)
##   batch a   b    c
## 1     3 1 4.5 five
## 2     3 2 4.5 five
params <- data.frame(a = c(2L, 4L))
# Equivalent to dbBind()
stream <- dbGetQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a", params = params)
as.data.frame(stream)
##   batch a   b    c
## 1     2 1 4.5 five
## 2     4 1 4.5 five
## 3     4 2 4.5 five
## 4     4 3 4.5 five

Manual flow

For the manual flow, use dbSendQueryArrow() to send a query to the database, and dbFetchArrow() to fetch the result. This also allows using the new dbBindArrow() method to bind data in Arrow format to a prepared query. Result objects must be cleared with dbClearResult().

rs <- dbSendQueryArrow(con, "SELECT $a AS batch, * FROM tbl WHERE a < $a")

in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1L))
dbBindArrow(rs, in_arrow)
as.data.frame(dbFetchArrow(rs))
## [1] batch a     b     c    
## <0 rows> (or 0-length row.names)
in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 2L))
dbBindArrow(rs, in_arrow)
as.data.frame(dbFetchArrow(rs))
##   batch a   b    c
## 1     2 1 4.5 five
in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 3L))
dbBindArrow(rs, in_arrow)
as.data.frame(dbFetchArrow(rs))
##   batch a   b    c
## 1     3 1 4.5 five
## 2     3 2 4.5 five
in_arrow <- nanoarrow::as_nanoarrow_array(data.frame(a = 1:4L))
dbBindArrow(rs, in_arrow)
as.data.frame(dbFetchArrow(rs))
##   batch a   b    c
## 1     2 1 4.5 five
## 2     3 1 4.5 five
## 3     3 2 4.5 five
## 4     4 1 4.5 five
## 5     4 2 4.5 five
## 6     4 3 4.5 five
dbClearResult(rs)

Writing data

Streams returned by dbGetQueryArrow() and dbReadTableArrow() can be written to a table using dbWriteTableArrow().

stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3")
dbWriteTableArrow(con, "tbl_new", stream)
dbReadTable(con, "tbl_new")
##   a   b    c
## 1 1 4.5 five
## 2 2 4.5 five

Appending data

For more control over the writing process, use dbCreateTableArrow() and dbAppendTableArrow().

stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3")
dbCreateTableArrow(con, "tbl_split", stream)
dbAppendTableArrow(con, "tbl_split", stream)
## [1] 2
stream <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a >= 3")
dbAppendTableArrow(con, "tbl_split", stream)
## [1] 1
dbReadTable(con, "tbl_split")
##   a   b    c
## 1 1 4.5 five
## 2 2 4.5 five
## 3 3 4.5 five

Conclusion

Do not forget to disconnect from the database when done.

dbDisconnect(con)

That concludes the major features of DBI’s new Arrow interface. For more details on the library functions covered in this tutorial see the DBI specification at vignette("spec", package = "DBI"). See the adbi package for a backend with native Arrow support, and nanoarrow and arrow for packages to work with the Arrow format.

DBI/README.md0000644000176200001440000001371415005150137012132 0ustar liggesusers # DBI [![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) [![rcc](https://github.com/r-dbi/DBI/workflows/rcc/badge.svg)](https://github.com/r-dbi/DBI/actions) [![Coverage Status](https://codecov.io/gh/r-dbi/DBI/branch/main/graph/badge.svg)](https://app.codecov.io/github/r-dbi/DBI?branch=main) [![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/DBI)](https://cran.r-project.org/package=DBI) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1882/badge)](https://bestpractices.coreinfrastructure.org/projects/1882) The DBI package helps connecting R to database management systems (DBMS). DBI separates the connectivity to the DBMS into a “front-endâ€� and a “back-endâ€�. The package defines an interface that is implemented by *DBI backends* such as: - [RPostgres](https://rpostgres.r-dbi.org), - [RMariaDB](https://rmariadb.r-dbi.org), - [RSQLite](https://rsqlite.r-dbi.org), - [odbc](https://github.com/r-dbi/odbc), - [bigrquery](https://github.com/r-dbi/bigrquery), and many more, see the [list of backends](https://github.com/r-dbi/backends#readme). R scripts and packages use DBI to access various databases through their DBI backends. The interface defines a small set of classes and methods similar in spirit to Perl’s [DBI](https://dbi.perl.org/), Java’s JDBC, Python’s [DB-API](https://www.python.org/dev/peps/pep-0249/), and Microsoft’s [ODBC](https://en.wikipedia.org/wiki/ODBC). It supports the following operations: - connect/disconnect to the DBMS - create and execute statements in the DBMS - extract results/output from statements - error/exception handling - information (meta-data) from database objects - transaction management (optional) ## Installation Most users who want to access a database do not need to install DBI directly. It will be installed automatically when you install one of the database backends: - [RPostgres](https://rpostgres.r-dbi.org) for PostgreSQL, - [RMariaDB](https://rmariadb.r-dbi.org) for MariaDB or MySQL, - [RSQLite](https://rsqlite.r-dbi.org) for SQLite, - [odbc](https://github.com/r-dbi/odbc) for databases that you can access via [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity), - [bigrquery](https://github.com/r-dbi/bigrquery), - … . You can install the released version of DBI from [CRAN](https://CRAN.R-project.org) with: ``` r install.packages("DBI") ``` And the development version from [GitHub](https://github.com/) with: ``` r # install.packages("devtools") devtools::install_github("r-dbi/DBI") ``` ## Example The following example illustrates some of the DBI capabilities: ``` r library(DBI) # Create an ephemeral in-memory RSQLite database con <- dbConnect(RSQLite::SQLite(), dbname = ":memory:") dbListTables(con) #> character(0) dbWriteTable(con, "mtcars", mtcars) dbListTables(con) #> [1] "mtcars" dbListFields(con, "mtcars") #> [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" #> [11] "carb" dbReadTable(con, "mtcars") #> mpg cyl disp hp drat wt qsec vs am gear carb #> 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 #> 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 #> 3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 #> 4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 #> 5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 #> 6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 #> 7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 #> 8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 #> 9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 #> [ reached 'max' / getOption("max.print") -- omitted 23 rows ] # You can fetch all results: res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(res) #> mpg cyl disp hp drat wt qsec vs am gear carb #> 1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 #> 2 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 #> 3 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 #> 4 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 #> 5 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 #> 6 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 #> 7 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 #> 8 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 #> 9 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 #> [ reached 'max' / getOption("max.print") -- omitted 2 rows ] dbClearResult(res) # Or a chunk at a time res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") while (!dbHasCompleted(res)) { chunk <- dbFetch(res, n = 5) print(nrow(chunk)) } #> [1] 5 #> [1] 5 #> [1] 1 dbClearResult(res) dbDisconnect(con) ``` ## Class structure There are four main DBI classes. Three which are each extended by individual database backends: - `DBIObject`: a common base class for all DBI. - `DBIDriver`: a base class representing overall DBMS properties. Typically generator functions instantiate the driver objects like `RSQLite()`, `RPostgreSQL()`, `RMySQL()` etc. - `DBIConnection`: represents a connection to a specific database - `DBIResult`: the result of a DBMS query or statement. All classes are *virtual*: they cannot be instantiated directly and instead must be subclassed. ## Further Reading - [Databases using R](https://db.rstudio.com/) describes the tools and best practices in this ecosystem. - The [DBI project site](https://r-dbi.org/) hosts a blog where recent developments are presented. - [A history of DBI](https://dbi.r-dbi.org/articles/DBI-history.html) by David James, the driving force behind the development of DBI, and many of the packages that implement it. ------------------------------------------------------------------------ Please note that the *DBI* project is released with a [Contributor Code of Conduct](https://dbi.r-dbi.org/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. DBI/build/0000755000176200001440000000000015147357131011756 5ustar liggesusersDBI/build/vignette.rds0000644000176200001440000000067715147357131014327 0ustar liggesusers‹­SMSÂ0 åC@Qü8yZoz€ŠŒŒuÆkhSéØ&�$Êpóg{7%)¡W=$é¾MöíîÛ¾v !i4Ôñ³~Š[ WW›4HÏÎøf:¸βÈ}Ðè“ò�EÞ+p)ÅÒ� ¸H”rU�‘K‘ ESßCÜ3÷ç4|gÜgi«œ……½›æÅnE– cªéœ*S®™ŒiÈàÃ^Ù‹'#›: /о1ë9{Q +àe¢02µXßáý¦±¹`Ñ»’tË¥ÌXJu"8MËdÄRd0Ê#x‚ÁFðhë·ÁN1†ÑGhžš0[žói–§,c\›)p¶Û{ãØdmZ“ÄIX�WúÓÝȸÐYê=Ùêè9·BzhßW²¦”Òs´�–ž}àÄô°N¡fì¦Kvr)‡ÍÍ…7j•îl“ähÊ9²@k3E¦ë醜üáü§8�·š«�ÓŒ)ëlY°1IR7±ÍçD—Fýq<±ŸµYù?±ëVN’¶Z ‰ö.QÇtÒ‘õp_¸­×ëïjFaJ•ËÈ�݇|K|�ÖÏ/0z6iVDBI/build/stage23.rdb0000644000176200001440000106567315147357114013742 0ustar liggesusers‹ìý |Ù}&Á$@HHA€ÀÂE�E Áû(TñÉ*VHV 3ˆb"" U*]–lY%²d«J–,Kò­¶,»-ÉíöÑîžé�™Þkvv.ïÌìÎîLOÏÎô®×³íÝíÝmMü#¾È| d¢øŽŒdÍnýúþd&óÿÅ{ß»ßû¿û š¦Õi6ÖiuëÉÜü߈¦­'Ôƒ?op�¶AÛààýªi›®á›i}vYw�§Ës¦=6¡§Ýv|ÝL[>}0oØiMÛPÇüÛMÓéG¾1Xì/Ö_¼yýúåwW~ÙsS®™ h4ÑŸÂOŠÏ`KþU}ð¯2VÖ Ì Zôßß®øÊúËvj…�÷î^:¹â{›M;å¤-{nE ”ýòFÛX0½?»ùrá´³âlñ­àøÆB.`´�>8ÿ×­¿»÷{ºò—SY˹.~Í[7ïLÝOùqZ…ô˸ÙL‰AÜVPsFr®µdâÈ¢áŽdœlÚt½‘ôÛ#Ëó�ÇÝÇOÇO,Ù�–?ñí…ÇGN>]L�ÿÍÙ#wG¦ý…ܘq÷æÆÈôlÞ þáØèø‰ÔÑéÌñÔÈ¥ S# †=’ž=ŸË™vú®1›5‡§W*¡n)½‚ÐÕ#%Kœ4[~²REÉTúJA‹ñ•b]CôÏÖ­ügî^¾Y×ýd…�‡ÄCß[|oÃO„h= ßÊš†gFE0í¤ò ¦í¾åغeëÓ#GŽ ­È— ÄK‹d ÷:ð&< û¨4wî$$÷ÇÄ#@cGô%tšJ’©µW/O_(C�ªÐzàØ;D¨•õºq&*ÍeÝ®3ùŒ!÷»Äó‘1„:l=ùL"÷ûÄ#˜IuÏJgãôÅ›—.—á³ Y#Éd9YRŒûSŽmêT¯ ê‹F6Àððð ii8ìWé“ú�{×® pÓ¯GNž„}R¡šòž1WNMq+¿Y+é¶&­¦Í‘ ˆGPMͲtè³­ â·V®&Ú@râdÖ�4”ÚüÌBF›V0ª;¯ ðinƒ½MY]ÝtŠ'&‚ÿ»¤”™¢¢¿€§aŸVØÇÉZö㕦`ðèä"®%o³s²äM†0^â~Ÿ]À~Øý¢ï³ê—›�“°'¥k‚-º3ûv𾃼E�hœ^�}EšN³áé®éç];šà$Õi4ÄfØÍRj/§úÆô,TÒ? @°8{¬*rßú“¬& ´Hï€}@‰¦éÛ€Ga �+$GÊI—kTñEÂc°ÅÆ|ì§ë†ÒõEñ({{Ë7*”ܸ�‡}<ù.¹?Á ž¤ilE Ä(ÞÁZ³+Qk?33Âz­Ø|Ëu%6¬`ÔuwÞŒÆUè/ç‚Æ.¨t[†\Tãg ˆŠëÝéÙÛyÇ7§Ò¦í[Ët¹ë_—�3°g’©['WÑ xöU%õ0á(ðìÕ¯‡ Â~(߇Öo†Ý;O7\s‚·B |\€½ ¬å�²õuÚÄ#HGãm,˜^;³!™E'tCOÍ®‘òMW÷|ײçô%ËŸ×ý VÊÛO¨œ¤õK®ßaë(Þ´kfð4l¡ÁEé²�9<7¬sRÙŽ´Û.�ŽåjÆ­½a*=¢Tꭔŕ¦6èK[�í°Û«_ø·3¸önéÌ©ã }§Ø »3¹Ö1´(-`�TÀŒlV -oa�É#Åmù†©4wãMŒz�` �Cøïõ“Si¶]ÀØ=JZkúÅvàAØ«_`[˜çP%•z,ª÷SÎBαƒŽ‘G’¥V “Ïf—õ'y#K}¥´L;@Lû�oÂ~³6í@kTBTß ¥ÊKÍ› †>©÷.,?ŠþÐ;ˆÔ þ’i(*•¿Š-‘Þ ‡=^}áµ28{B:û¸{bäþƒx’j(�ß!> Å·kÕj(6Þ¹}�»¥ ê‚-TUñ·&Ât»€:l]ISA¿Øì‡-<ýì%–ܵ`‹Í°ŸŽ‡ vz�v‚·€ÛÃÀ×a¿.ÍzלµhÚú¢éξµ0¨‹4Ì> É•ÿre¬‡ÊØ!¦½f›‰CÜí±Ü œ€-Taó©ŽÜµOÁ« ÙO¹Û ršA<ŠÞ~sØ>Xï”K€mEeÈÍeòµLMŒÛ:Øuɧ;»Yh}ñIšFR ÆêL(o ·7pR£Ú¿Ø»Q„ZHi½ôât;4KØ »YY­Ö�6|c8ãòϼ·#û{`÷T¥û°Êív [—p·Þï¸ÁøÊtSµŒAG¯˜0¼kVÄmð ì3Õ¯bÚQ�ÏÂ>›|Ù&÷çÄ“4�ÝH�«SŬæUÍ�Õ·ÀÞ"\Á¬$tðfÐõsõœAÊõM×+]³ þnÞI{"œ·�À>R}Ew ßÇ`�%/%r”Akê¬Z�°;”5Ÿh£$oÏŸ¨èÀ>Ø}Õïùï�t÷ÃÞ/¯bÞª„Ü`Oµ«’=(0„a ÍË•arˆA<ŠÞ¾aÆpçÂs(åvÆoÁkïÕdë©$ ÷u â,‘eéÐ<ÒfÅ÷\—« šK÷^sÏtkQEJ¸ ¶Ðœ_]Ñ y2c5I©4bÛ¢§¼¹DDÚ�q×Zl§>ûi½—2²†ËK¦)Ò£•ìy—$³ÅJ®k¥†yéè @—q¡eY¯›f˜Qôª’³ùQÃú„Ü×1(WŸHïEéÕ¢1zŒx$SeíDãdÒ‡ëëÖB.kO…Ó²Ç[º DÆ ­XÇg­ÒµÛ{’ejó»fÀ<,w1#–W�a?L¦˜µO–�7^‚}IIy£_ì>‚ý¨úå�Ù¦½û-i�7„ËÊAgó–;âa߆ý¶rA7¦g/?5Sy Óì@0œžùˆãG -@º Ø[¨.ûËõÀý°…¦�ødËÌѰu ´l »#8~FЍ¨3½1œ¯çíB‡ãÀ Ø l! w£ÀS°å·4êñÜwSNDN¯À¾"MhÃ=�[%‡ TB5C®rjÙY2ô:ïºÎw-wéE8{<™ZnÇäjþìã-¶}°…ëèU¿Üœ€�@™"w�§`Ë—©ƒ´äg„I®gë×YZn=Ls:Sb ÜÅ튡Û�æÊ=ÑÒ�ò£šé'mmò´ƒ‚VR1âQ$°­3iÓK¹V®f`Õì%Ôa™D£o0=­eÛX°RW²a¬¹xŸS«Š´"–u â¬NÛdéÄ1b?fÆ~ÚvÁH=J¨îïÏZ†íÅ–—¢OáŒ}Ûùw¦ô;·¯éããúÒ¼•š×óü­âø Is+×®;[‰N…ÈTD£‹A<ʪxÚÅZÁm;�YÎ�Ì¡1ÝðtC†º)s>Œã§gWϹfÐ¥4Óú“¼éZ¦§§û�¯Û&ÿÜ#ñíÞ‚}Kš÷Ù er‚”r­´©[þ°^(aÝÐÓV&cºAw0”Ÿ·lûÆSq Cv„gaŸ­�‰ÆÕ6%HîίÂ:-W�’û—Ä#Iã賄TÐý)�“ø”C(Žq­îýöÒ‰,î®=±» | ö[Étí›WL 0?¼û†’n=ýâЀ-ÔgåëÖ“»cÀYسÒJçŸì&ÿ)`vZšÇÕh¯ál\s÷‡Uw±âfÊ¢§e1ü˜â:¸fv¹ø=Þ—EÉ#¼ [¾\2–Ãs•Ñ]´pç „M¦Î6V“GGÀ’pE,åç`%–XVcm¬BÙ wCÀ °/Hgã¬Är¢qø ìW’oÇ �ÕŒjE¶0 œ¢¹¬’|ú¨m¦åJ|âXX;`«Œø[A®än#p'ì�ÒóBaÖS·¼0¢»—ÏåñÞýùàoMDwÏÂëò²Ÿî¾å:)ÓóÂj0Üä í8E2[õw¥vÝ‘ig)ÔÙ]碓Í/ØÜý)¢x xöÍdúS;'˼€ýÀ“°…£²®úåà-MbdÈWÉ]ð6ìÛÒÂîÒ£Ý0á2=…Ú‘){Dmhö•¥Ìæ™´éV¶Ü&ßP–^ÔT¶Ü͹¯c�`ñ¦]®x7] R!äÙB Þó ´ZÖlƒ-4+R{A6ÅŽCÉ1âI:ãN@31ÖH?Løh…4º¦2̦¼´cFM®ùÔòøƒ»Žƒa¼Vh±tq,'EÛ\Š–l,[ç$62ZI@ E·MQ£ÏÛk#2�ÀØ=Õo+È]|Â^‡­KgÒ±¸³fÄËjAûL#\ÚçYÿ¦Âæ: ³àqË‹ïÞ…}WšùIÃÖƒql@5x×°<3}*Ô›k.8ñ¨—þ`X¶§çíÔ¼aÏ™ü à)èî”& ^®9 ×1ª©FÆÏ¯JD}iÞ´ËuÂIHCOe�ê}” ™êF’~;·ƒbl¥õT!’7wŸ!Bæè±ìø‚M[#ë9H`^vgÁˆPn|Á~ºÞÊèœDÎÁ9ázØbxcæV¬‹‰J°I+Ä¿¯v]Lî6·ÁÞ&�%�4£Ouñ¬©ç¢±)G�!)ñjöÊ´öVÛð:ù(½Äò0;¥0וî¢W� ÔK¼_NÁžå¿ê—G€i­0é�„¼€&lSZÞ‚noÝG 2@ ¶%ÍdŸ•‰6×ôòYŸî 6Û±‡¢StÜ Èù¨t„¸ö>ùÖm M&§2èPs’»B„r­›ÚÙOâÓ <û`õÅMîvÁ–�kÙP˜ýäÕñè�}DšÏ¶þ¢œù{ì!Âm°åÛ·Ýy»8%Ž6üåœÀxâ]ÒTM¸²ßª»qžWÉt覸¶ÐÁk>%_Æ»n�½E:—ê*Þ–U)?Ȱ¶Pœ©Ò¦¹ØeÖã¡wÅ|ÉB(H�ý”{ðƬí*¼qÓx ®_RJ£á–áy4V4tN>Sà0¥¯)v¿² ¯3­bY&.-À]°S0…²Cئ®Ê‘íA×äŠs9ü¡_‰T;�Ùû§jà'y†¨ž€-t� 6 O–Ÿ ÚÁÈ—qà9Øçžƒžñ¹ ¼ ûf2™sx ö­öìˆÇmà°ß�æÓÜŒVr†ë[©|йãÕÌËQN‡Ø »Y]Y¾;}ï2¯\ˆJ°vGõåò2¾HØ [>~ÿ�L„0’Оk×�¥=CõÀ»³¯@�„ »³ÜùAþ€êº³Ûè”±�Ëo¸»Ø×�„êd-aïÚï^_ÂØ-É÷koÀuŒÂýÚ²^7Ïxì]§«–ºÉÛMYÏr @îëÄ“4�[H�ÅScÍ­wrfÊÊX)CàZjƒ€mšìV‰Ùc6ýÔr«Ä42+ÆÉø\ßQJã%:uóØ\^rÜtthbÖ¤ƒ7i=ãš´};èOoðK»ÃèaeÞ·¹‹7 dFÞ’os+\«Y.,z9#ótÂ]ì•#[¼rÍÓ½|jžŽWÙæRÖ²Ã*?¼:�òíÞäžVRÞ%ߪ›²%œð‰ó†2…Ð)ÏÍñUð"ì†Ý-Íq< .ee ¼f ÏŒ7¹zÑò�í ÚŠ”n“ø“ø5P&‡=.M?šO ׊bç¥vtÕͧµ’ÙRÇ]Ö^ÂVØ­ÉW`oÀuŒj*°iË{ÆÉf�%šf+Îœë ˆ$\œV7|=k{ÀÞ]ÂxÇå‹ÒÔ»(ggiŽ‘F™ �%ËB«Ú3 E(·Mm­UíV¬jO”ÅN­¿SÀk°¯)뎮}j-ZÏ.p`~x¶š Öô‹û�×a_W˜&Æ”ä®xö iU×qß2KþooÁ¾%,Ý3²õÔ-êùÆ(~üŸèhs¥Bë‡Q± QÝÝf[‚>ƒoΙܛ 2¸ ¶ØàZ(5!)N áåM�G Ê¥ûik?õšfÍycÑr¢óÌœ¼ÞBÒÊ5ñeo¿˜²3•2®Ò<1éÆAù÷T¿N#w;€{a‹Í–¸ ‡yÒÜ[lßKÙ<¹aÜÉ“~àa؇“É“^à °_�Γ…“tÑŒ‡™æž8$BƒÀ3°Ï$W·Q¶†¨²nË:sÔ‘äM ƒÁÔô³H�Y¥©±NçL…ÙˆGQ©Xp "MÀm°…²…¯Ð’»z`³&qÍË qžNKÚ¼âœÅ÷wÃßÖÄ-ΙR*Î6ýø±¡YË�÷0öçí"œI“bpl¡–¶¬b7÷ÎZsAß±—W·D§8{ úº%w{�‡a µq%©ÐGº Ú˜l:œ\ˆÓÐYÌšò*š¾¼[hÐfÛfÙQí n`0áQ�‰Be*-`GéàË¢NþPˆÄ¸Û?ˆS ƲN'v(|PÊò,Çæž2< [lÓ‹Pºe�V¥évšI7£8U®/š)ßqãÔ£Ë|½Âýôz:HÂþnG†Áó°ÏK¿A³kyêÅAÙyIÍ!) ›a‹µ~B¹:—óŠKÃ’kù¾ÞhØÑzH4ßMÛpÒ˜3,»x �7Ýæ”* e½®ußoÉdk´JGîëÄ“”pÞÆ›¿­T8�L@¬féè÷î^:É›ÿQò¿Ø[¾c´°¥� —§ç\Z[FþGÆOŒR£#ã£!F�þ±Ñ£Ü£¹%ȇP>N¶Æ[=…KB••‘o-pWFO|n+£e$¡ºÊè [ŶðbTËž7]Ë�®£áäúø„}PY5µ™N|R>óVUDgx ö±êWUäîðEØòù«*òx¶ÐÉR±ÿ.„@¨®Ä7†%Þó�…oz¼ËàvØÛŸ·bÿ ¤áóÑy,Õ÷Aêoݼ3u?åó–mb³Ø[¨æ+Ûä® Ø [þ¨%÷ð‡Üïa�$�Ó®Iûsü(\ž–4ýÇ6õÙ¼nß±MŠåe¸VvY—lÜE|™÷ > %2%ß Õ²sÕqþyåO� a+ìVi^'‹GâÚ«*�¼Oƒ1¡º�Iêâ3`ý¥ºhY© ^ZŸÂØ-ʪ›µÖÊÀÛOk´VFîëÄ“4�Ï!bT“Ç®[OI¯8¹IÁ¹-�ÂÈF ¯–Wlè¹ö|l �ÁêŒÊ%àOÃuŒ5’ÓÏÀõÏ(¥!r¥Æà�pì ʺ7B±@‰J#pìmÕïÛ�»�ÀfØÍÒyÒWr›F1(íÑ O‚ñ+ü¾G8{LšèÕ %Fñ.tß166ˆçŠs‘áñ¾8’¡åƃiî5? ÍÊÝœDúk’-˜_Ô¢íd1&¼µì}¤ÀûšÊAãA}*C±!òö:sœfŽ’£•ó �3©ÞgðØb[å«qƒÔû(„ç`Ÿ«~%Bî�çaËïkÓ—,Úµ—¢L 2Œ»Þ N€¯Á~MšÛŽœéÎA>úÇÁÆ9‰} J'T;À¾Õ��)Äø þTŸ Ë·¶ˆg'pB+\"Pmm‘»�ÀS°å/äæ®"Éýiñ$UEþB¨®ŠÜ«ãì“v2´™4�³@”½Ÿcpl¹ÃTÕ ÚM,/g`Ï(sµƒvïaàØDù¯úå~àØª_ÌÉ]/ð!ì‡Òïœ:púížCûAýÑ´csOQ¯GÀ§°Ÿ~\»Ÿ?•¬¥ºŸÜ_„·_Ðj:%÷u âIšÆ/"b¬Ý€øËðN¨~@,‹“ø4¼c’ÜmîÔTÝ1ÙZÇ¡O²ið luk®B¡l‰Êpöh29tx¶Ð½Ò¶y0ZÈ33õ‡ÂSÜ“~Di xöijíÓÔ„ €4gÖœ´jü3’¿å{ˆê¶Ðs×|_�ëkÔ|®¿ª”†HüËðN¨¾ &N\�Ͱ›«_´ÉÝFàvØÛ¥3¥guåË^Ç«"×�="MòÎxùYÏ ÇcTE+^üÇð–Äp¥�&‰¸k€_�ºÕ­I&Í;nÚtW².Üî¸`ø¾É¥õkàHx¶üyaîªâ¸ŽQ¸ª¨Ðg®¥õ6¼}(ëY.È}ƒ5ê3)£xjPEÙð¬t*V’¿ªEcŒxUÜ×­ �fz’·\ó5þ.³¿wúÎíkÁ «w0ÖZ¦Ÿ]Ö'uŠ]>0†¦;Ÿ÷�œkÙ~ÿ»z_P_ ¹¬éMexßíxÂû°ï+Óü–™` î{óÎR×뀯Ã~½zj[3 Þ`�$�Ñ”c맇ôôìÅèÞÇ~äèÄD„ýƒzïÄ‚¹à¸Ë½w.T¤ýM$á(ìQiÚû¾®iøf´<¼DÀÒr-/"?Ï_7Â}°Åf Wðd—Qðü¸}K)Ï6N#Ã’Ÿß¯ƒaìi~­éÙK–‡«I‰ ?±oƒ a+ìVeÕcó{RÜw´¨R#ì„-´³�¿‚ûƒplùÝ|üùßË eIgN…¦“^û»ZM;6侎AñŽ ItB–ÎohÑ|Œâ‹ñì§=7Ã`—.L],Ü4¬Ï™6[ñ&t^’¿‰ì"ì�Ý#U¬Ëï%t‡RYë4ƒX‰èoiÑ~ÝßÑ&Q¢ưŅžUnë�:l]¡Û CçßBVªk¦ø/!!ÿ½À>Ø}Âò¨« �Ö’fþ¼ëÆí3óüm(‚°vwõÕñÛPÄoC”õÂ¥§$›ø÷‹ü6äùÛЋ.ª>™þ6¤ùÛ�ƺ—éoCž„ûaïW.Ó¦’^3'Åß�* ;` uìøú;P%a'lù# %{€R×Kñ)ôw JÂ.Ø]5P(ùïöÀogרH…ŠT¤¿ iþ®–hEú»�æïj5®H‰€L°"ý]H“°–)ùïV¯"m†£†oÜ]ÎñÖ¢¿I¶Án«¾<’$l‡­àü:¿<‰Àn`‡&q€�Ož¿IvÂVЊpË“üïÊßQXIž[ÙÙN†ßƒ(¿‡ÌiÒ£çò ô{å÷ ‹zQ]È ô{PÈ÷�;�Z"Áè¿Q~ÂX', 9�’ÿ.`7l¡æsM�nIÏ^~j¦òãT¢÷÷ HÂ]°wU_�Š$lƒ-Tk˪“´wÃVY:+¨óïA‘„°”Nnu’ÿN Táü¨aÒeZÙöD†I¿Uþ¾–è0é÷¡Êß×j‰~²ü>TQ¯©Xg�è÷!ÍïC+{EµÂ'ÑïC–ß×TÞ¦È/ÑïCš„:l½M| Ñ);ãpÒû(’0Á&þ Hš6ñD ˜`ÿP$a-›xòß ¬^ߪóvÞt—9ùý’ü�–èþ�ä´àYþ@KtÿHòZmð?€, «7€o.ÊSdô¡Ë?Á&Ñ2ħÑ?„.ÿiS/œ6’%]@©A,ŸFÿº$ì�-Ö÷“Ó(ù×�RSÀ5É4åѦ¡›v–·ý#ˆ’0ÁI¦?‚( k:ÉD:� N2ýDIXËI&ò߬ê$Ó”÷ª‘µÒœôþ>I˜`ôïC‘„5í��v`‚=пEÖ²Jþ;�Õë�Õç5Ëó¯ÐEa¼[‰þ¢üc-Ñêó�!Ê?Öj\}þ1rå�esˆO  QÖ²ú$ÿ]ÀêUŸM‘@oF'»9)þªü¡–è,è¡Êj5žý!”ùC-ÑYÐB•?Ôj; úC(“°G«Ö,(:† áUè� Ê%«ÐA•?ªµBUþ(Y…þªüQ�ú#¨òGUU(ùp‰W ?†( lä QþX«q#ÿc”�k‰6ò?†(¬Õ¶‘ÿ1 È�µj6ò-²áþÊüPlÒÔ®¥TPéŸ@™‚Ô©NI•� ®I,¦ð©ôO LÂZn¯'ÿ½Àêm¯odN§qüÐ$¡ÔÅ-|úüÐ$ánØbw�Kê“t;a«\ë­ ÏMª;SƯOò¿(µÔ»¦>·3ú™¯ÿSóOÁ°ISÛ« Ò?…0ÿ‰S/œ8’"%Ý@©ÎŸHÿÂ$Ôaë5)ùßì…Ý«\¤M$ÒgQèðÇ?„* -ýC¨’°¦£%"°˜àhéB•„µ-‘ÿn Tý¨fþŽi§EVåÿ š$L°™ÿ3h’°¦Í<è&ØÌÿ4ùgZm›yò¿XÕf¾ O‘fþÏ!Ì?×mæÿÂüs­ÆÍ<è&ØÌÿ9„I¨kµkæÉÿ>`õšùæH¤w|Ã7)Æ'É¿€. Ü:òÐå_h5Þ:ò($¡%ºuä/ Ë¿Ðj»uä/PFþB«æÖ‘éÙ{Ñ]ÂóN mþ¥–h4…¿„6ÿR“Œ¦ «Ó¿DJU&|:ýKh“°¶Ø|�œNÉÿ~àØ”ëtkzö5×;.ÿ� J§ïÿDIØ¡Õpúžtœ¾ÿG%a-§ïɰªÓ÷E�ŠtIÿ Êü+-Ñéû¿‚2ÿJ«ñô=èêZbÓ÷eª›¾çðDî{Ä£èí)’¨I7O–ñüxé Ä“tüã¨l�`)]Y:ÛÊǸâäøO´(òÖ?�<4•=�Í�Dm:FVÁó: ®©8qgÒ?A!‰qŸha)û­ºétŸñÿ^[Ñ'}£‰¾Ñ„_i�þ®øí#å:½;|¬Ä¿{’Wªø«Å4›ñ�Ù¢‡uÛÊ|' þ盞Ï|qóJ*3FÖ2<æ›Êþ”iUšeÏ1_ܰâK›©(4û6 ß­ŸÉXsy—ýêÎ_Y?“rKßpåÛ™^ʵfÙßhYñ¥�3¶ã—á³âKió‰]ʤ,鯙0*6¢$¾¾£øõ2ÿÄ6—R΂a§™Ò¾Æ?©Ÿqr+\ü¥]¥¿Yù÷û¬Œ�.ù§½«Ò–Tã„ûûYå¬ù»ƒ,ͲiÝXöK³N6½úKeRÁʘY�ý½¶U,ï[0ýy‡ý½Ïó]§D¿•]—ûÕ’¯4å!¿`ºF‰¸¶—ù1¦ž­XpØ•…/m\UPA¿ð�æUuBPH× ½a&÷¸Ìû—zé3í´Åj£oÕ¯,îGüJÜÿY©�)Sè&¬Y<›f\³R!Z‘oF>È7W«œÒ›fòž1Ç2ÛXA›f²iÇg3¤\ËM/|¯¾Â/nE…µ²p¯ä$žå—)GeÚ€¼›ÕJj‰2õ�›lv–ˉ \õª+KÚÑJ%mEzÍR>["�J%²a&¾�uÝ\öE�¼_ú¢k¡ GrfÊ2²¥ï¼ª ,~dÂEQs×L¸ú™éôÍ\ ÿ†5¸m˜IgØœo,Ó€Ú¾›·×àÖ4“ ª}Ç ¯2H¯ñEªxV–˜reµ~&î{Ámšñ-?û,ÍûæêàØË á|SЭjŠÖÈÛµ^+ëÜ2ß}l./9núØÖÍL¯!þ�3^P9——ßÊÎFxëòš=© Z#¹Ëõ“¼^ý+\G·6¾ÔZÞµ“wSÏ’gŒÙÙ2µ|…//š.Û-×]iŠJð5¯´î+—B›fÌÃÊ–w¾²¼˜~ðUoõ­¨yi:âÎ1Dï­Xþâi‹ÂšÊüØ–oÙvržµ¢Ï¼âî˜Osln)óSëgJZÚ•íõÆ !róÏ�fÏ®U4-hÆ ZÑ”ùQIT�•ºÂk>TÉwU ·c&g¤Íî%¶ý«‹]tT–v�KÅÔ–m¡!eÿÑ¥(áߌ®õ&Ýô ç®'góV6ýà]ßq²ÞÄÄÄtúH=bZåþÞ¾#½ï•vGdCÌÀÎÇ…ì¸�þn㪡{w¯ �Œ>Ü´òC-úûÍä�zëÎÿuªîçâ¿/ 6ëâ‚|ëæ�©û)?[øG¿˜ò +¼:rÍšu wyä Ý4T‹�½‘éáLü‡‘W£’é�~qÈpŽ™6£ÚÂñæ ×™N�D£ÖoÙ *›áxüܸÒÛ#9×Z ºÆ#AOq$ô÷ƒ_I¿=²<ÿxÜ}ütüÄ’ýhùñß^x|ääÓÅÔhðßœ=rwdÚ_È�wo¾aŒL‡fŽ�ŽŸH=‘ÎO�\º0Uª°U£ðú`ŽAH¥¯¬š(S*oM É3½ò+‡W‰±D€ôÙ£[Óý}GÊJndFx6s߯ùÌÓÚòkÆ]ó>ó¢»Å_ôkïfƒ\úÞ»Ô_{÷ÝÈÃ{ï½÷nd”yÇQ¼áì eï¸yfÖš�ºq*²³®ïH™W˜mÂØ"¯°¢•ɹÎ\Ö « îes(å?õ½Ì»}G(“‚ÿ/ózÇñJÇK_U,‡VçN4Ô©^î0GaîÔÍLU“ô8ˆb~™½rT�ô晋Óço„S*¨çŸÞ�÷ýœ712B¿=<=¨–Ž�;îÜØÉ@XïÒÔC¨³2¯ÛŠW$¼ûº‰=Þðº*5µ\g¹2ôÉ äèåÞj7Þ„pT+TsâU[™‰¤ðÝhT¦"WÏð÷ŸÂ1aåž³=0¼ºj�Vr}•X:<ÓDgsœ>SvÚ »¾*Rè Y‘ÿÊiÄ\*^=¾N+¹z\²,ö¿/ß¹8=uëîÔÍjÒB ·Íp¨œ‡�„ezÛ‚à¶8ÎcšPEœåO‚h–²òÛïÃÎÀžQRn˜I;–š÷z†¾mà¬ò[áÍÏÁ>'�Ç­q_7,ÛSQ>_äÏç……Ê©°oN˜†�V^;®�'ý”<¦Ó¢±ïãToÌ [í‘’{z C×bß(çš¹`”KYŽÀÏþ�ÿ¼ÀzJÀîëÙƒô«´²�Në³Ëºë<]ž3í± =í„·Íši˧æ ªZ%¼ú‹7¯_¿|£Üê÷:æ,¢ðŒC]¥ëWm ¸\\ëý7«§&6Zwïû¨ššð“Ìøp§ÔÿT&.ä6WÄUoŒxby-Šíñ8y@¿•5 όğvRá�l}zdìÈP¹,á/u OxöIéàNGr?Î ’÷‹½zyúB~ëµh—a™“JÏί¬×xÉ£¬ÛuÀ2ãî¤r‡Üw2ˆç¹ÉªÄ7;` %SY¯…½=eý®–‰ªšTö�û= âQ”=CS¶gº~Ð0/yAåã;º]X¯g\gA7l=Ì2Ýó]ÓXा¹Ex ö1…9‡•Ö²~×_„ýbò9Gî�3ˆG0çêž•NÅý¼›�1â‘L–VpºƒØÔ©ÚÔÃ9ƒúðð0ÿµÄõÈ<Â`¿ P@ØèR6¥Ö!…˜>fÒÚe{ñ h«,�-Ñ��¸žµr5Ò'³h¤¡Ôæg2Ú´rëüy]€OpìmêšÔ ¯<1Q²Z€ß ÀÓ°O++WìɆ­+GU;'åo &Ú»€ý°ûEé¯úåfà$ìI¡Œc?Ý¢;a Hîƒ2Dã ð ì+Òtš OwM?ïÚÑ œ“Tc$É›a7K‰»B¼¨¤âÁ•µöÇ`�%£î†ÉmÒ{�`P¢iúÅ6àQØG&G…c<�ø"á1ØB�¿ÒFkX ]_d�²·�ö”•-¹q!a–‡“îA�û âIšÆV¤@Œâý©5{Åqö33#¬×Š­µ\Ïaà F]wçM §¢Îp.hì‚J×±õ`¤%@5~Ѝ¸Þݱ*è!wýKø2pöŒÂ"·FýÛ:)³±)*¨!^…}UI=L8 |ûAõëaÂÃÀ‡ZaýT¶1¬ß ·zºáš¼á#àìa-ï”­Ÿ¨�ÞÀ A:ocÁô¢Ø¹ É,:¡zjÞp�”oº4�cÙsú’åÏë~P+å£iýÒ…ëwØ:Š7íš<­vI’ßhÏ ëœT¶#í¶K§cÙ€½a*=¢Tꭔŕf2èK[�í°Û«_ø·3¸[+lº‘Ìþÿô�`™\Õ.`-C‹ÒÖHÌÈfÚò™›]ÖŸä�,õ•Ò2í1í¾ ûÍÚ´­QYQ};0”*/5o.ú¤Þ»°ü(úCï R/øK¦¡¨Tþ*¶Dz+pöxõ…×Êàì éìãûS âIª¡`v? Å·kÕj(6Þ¹}�»¥ ê‚-TUñ·&Ât»€:l]ISA¿Øì‡-<ýì%–ܵ`‹Í°ŸŽ‡ vz�v‚·€ÛÃÀ×a¿.ÍzלµhÚ:�±4|kaPi6vF%#Dæ`‘¢f£‡ÊØ!¦½f›‰CÜí±Ü œ€-Taó©ŽÜµOÁ« ÙO¹Û ršA<ŠÞž9D]v® >r&5—É×251në`×%Ÿîä~=ƒx’¦Ñ†ˆ±:ÊM„‹su8í^!?µ�Òú”:ÎÛXL z󦛲¨klšÛ´Â¸&´…Æ7kv,Ú†í´'dbÂðþô(ø#¨ Ã]EÜ=â|øì÷’éyô_¨âû¼ÍQà=Ø÷”tL臀Ÿ„ýÉê7äîðS°?%_Gð®ü‘ûO3ˆ§Úu{T Bü ìÏ$_C’ûÏ2ˆ'iì ¿êUÔ뇇yÕA3�ˆÿ~¯>BÁjzU½w3è@»zΠè¾éz¥+Qœ O„óVàØGª¯èäáì±ä¥Dî�2ˆGÑÛ—DZZå{ ^;Þ\£ ��(1â,MeéÐVäÍ Šo(-W†v–ÙXÊ=Jbâå—»$§ZM ]¹ÜÝÂóHѶ-O7x³j/ó,¢$¡z/ed ——LR¤K+Ùâ+IfKmÐJ óÒ鸠 5e½b–->ä«G«i¥Bî딫T¤×âu-ŒÄˆG��OË.�Íû YNfû Bf´D—a­>Íd5"keÌÔr*k»CYk6 a¸¾ü�7ž¯õ†émú̧¹@ÿáY²Š¯Vጠ½Ò.àmØ·«öj�…Wb9{‹s¼g€yØye½¸®(Ȭ7¡YòЛ—² P} ü*ì¯*«eб‚Ë:¾ üeØ¿¬° ŒBì–uÛ üØ¿"-©•Y´­4SJô·�߇ý}…y‡Ó-ëøCàÀþ…Žã¸Àe¯þö’osÈý2ˆ'i½H�Õ´Àh×''“>x'd>O]i¢Öì†Ý]ý®4¹Ûì�Ý#�G£ƒëÁ°<è6zº?oøáªW´´5oxú¬iÚzð¼€WYÄVÞ„}SšuÛ,…µ5)X–¸D¦~ÙxÌDº„Ö*hîb˜vÏ ¹µ˜ž¾û…’[c¢wÇäjþìû€/Â>z°ê—»€×`_«~Q$wíÀë°¯K‹ºŽ{ÀFþoo–/\û¨ÚN›#Ÿõu‹BÍÃ2Ðî �·œ@Ù"dÚ]Å嬹¤nç.bDî ðl•RZ£ˆm›,¡.@|x ¶ÐBtÙ_î^‡-$s¾ÒÅì¶ Ý¡¤ª·ëA‹¡›Fj^OÍçíǼeíÊáCØ¥Y5;™°±�̸+€ƒ(M„Ͱ›åûm÷<î~…MM¿­ eœÈíŽÀù8”qflØålÑ$ºœ«~¹8 {´úeœÜm�-´‚Sº(MkJF˜ÊzÚð Äîí(€5w #‚cÀ»°ï&?@ëG‘ŠQÍM[›…<í €†ýÕñ(R׊KRVyבPqÄL¡D£o¬¼ŸK>aˆRƒx«Kú×åªË¦+†•Í»¦¾”BÞàq\Â6ØB££�ÚÙ# âIº 2ÑõDnCp=¤”F×T†ú§Ó‹b>µ<þ˜ àEÈ,tIRÜt∢m.EU¼eëœÄF@fD+Ùç.ÑU)ùV¸ÊU©°UœT"2�ÀØ=Õo‡ÉÝN [—Τcº)Lj›á éÕƒœ£Ù$ºcŠî¡�{Ùü‚îžö¸åÅôß ³úò óIÃÖM× ¨oà–g¦O…zsÍÇ�K†K—ÎØžž·Só†=g¦¹»£Ða �ëÕT#ãçW%¢¾4oF³tøÖŸ>À¼#�Ê =•u<þÉÅ1P&‡=.M¿�ˆÛA1¶Òzª ‡;‹�‚P¼¥q�&xÒµ„Ün6méB<$0/»c`DÈìM“d·ÞÊèœD˜¸tl HEµñZ¡0*ÖÅD¥ؤ¢XU».&w€Û`o“ΒΠÔÙTÏšzÎuRf¸ýNdºœx5ûa ïYsˆ¿; ê%|ƒX^¦`§fâcý]ô ²ñ7˜=ÚT ùé—F€iØédä=4a›ÒòÞt+xë>b�Z°-i&û¬LÔ°!ê;õL� dE›Ã¸�ãQéQnÚœý”»�p®cî#”õÊ\ŠZvȇŽQ-ÇZ侎Añ±º ¦ƒ#™kNÜ¡Q3VʧHÇï€òS½²)F4:¬Ñ”Á)dVŒ5’1{»•:/ݹ}MÇí©u5¨Ÿ‘§.FÆ5Íì2Õ‚ÅC²Þ`é /so€»*¿‹#T·ã¯ëÔ³3rþ2®0á^^ºJ„°;¤éè�Îb‡U€‘¡,¦Åº¦ÜëWA��9=šT)x ._SZ ôŒAÍŸÞŸs<ÏšÍ.o z‡…"Â�Z¯18 {8¹Ôº�º¯4µZÞÕÓéˆdÐgÖ9Så>ƒm°Û” kf³ÎìÄý¿¯~àØGŽkÖXÀÚ’äÜ<[¨<–ýå8Œíì±ä›]r”Aᘊ¥¡Îû­ ³|<»\²»�»œ¿ŽÂEØ[¬ñ*çoÀ%¡ºr¾‰Òƒ{ðûƒ�°…‚Ksä×)^’o"‘Þ”Î/öÓ­l£ÁÉh,™»(Õ‰.9YIU•¦yˆÊ`l¡jšoš‡Ü5ÛaË÷Õê¸Ë4ùß ì€-ß);ZØŽD…ËÓs.­ £¶#ã'Fé Ö‘ñÑ£ÛØèQîžøȇ�9ê’Teô. UVF¾Å•ÇCŸÛÊè‰P]et�­Œâ[BʲçM×ò£#øœ\ß?ƒ°*«¦6Ó DÊgÞªŠè �Á>VýªŠÜ¾[~óUEþ�OÀ»CY¨Ä¡ºß–xÏ7r¼éa0¸ööç­ØÏ"¥Ÿ�>H ,Õ÷Aêoݼ3u¿â­óË6±Ùì€-Ôó•mr×ì„-–[nøCî÷0ˆG’Æiפ½~tä× KšþŽc›úlÞ·^Ø&�G4\+»¬‡Óíî"¾Ìûi(‰�9é ù­–� ¨ˆóÏ šàBØ »Uš×Éâvó¸öªJ'/Ƅꎩ'©‹9°žSª‹–•ºà¥5*„-°[”U7k­s\�7 X£ur_Ç ž¤i¼�ˆQMj»n=%½âÔEtœgn< …-šY^±¡ç>”ñl ™ÃüI'`®c¬‘œàzA) ‘Æ6¼ª „WâU$žQinƒ½­ú}r·Ø »Y:Oúôø~*?ň´¿&<ÅÃ$ÌÆ÷Ç`�I½´Ä(Þ…î;ÆÆñ\q¦-<š5éó¦åƃiîÃ4GÈÔ_“lÁÌiÑV Þô)ðDS9h<¨Oetƒ¶9àjØâ¡?Òa´ê9¡s&Õ_€-¶Í¹j¡ÏŸ „^†}¹ú5 ¹^�}E:Ûô%‹¶9…K~ƒ\ã®<ž œÎÀž‘æ¶#gºóFЩÆÿqÔ$Nb.äN¨>ÌÙ¾ÕZ(VÒ þTŸ ·¶ˆg'pöDõµEîvOi…û|“îÀ�ûÓ ßã+VOz¡ºzr¯Ž€‚ØèêdÄ/€÷Ü[î4L5£ËËÀØBµB…l¬vô!â= ¼û‚(ÿU¿Ü|ûAõ‹9¹ë>„ýPZà�A/N_ íOh?¨Sšvlîy âõøöÓ�kÔ�JVˆR}PîÙ�¼åµšGÉ}ƒx’¦±ˆˆ±F©±×KJiˆ ΟÂ;¡úÁùš×¤Wì÷—F`3ìæêWˆän#p;ìíÒ™ÒS�Çá3ذ¼Ê!r-ÀØ#Ò$�…ñ1Œ fœõ̰WB}”h²Î‹ÿ='�i¼Ä==· uª›ž;LšwÜ´é®d]Ö¼`ø¾Élîp$< [þØwUñ.\Ç(\UTh9*››€·OÈz–Kr_Ç`�ZŽ÷�1ЧU” ÏJ§b%ùI-ªcÄ£¨âþ¤•Ñû]óIÞrÍÔ¢¨_ý½Ówn_ º½ƒAçÎ2ýìr0´½;}ïò€~ð ¾úë¶a;Í«¬þaHžóyßɹ–í÷¿«÷ŒAw+ySÞÄø€ðgaÿ¬²B²e&è¿úÞ||Í×*×ë€_„ýÅêÉsÍ$xŸA<’2ñ¢çÏ‚'áì!iÎlÔ*†,?¿Ÿ'ÂØÒüZÓ³—,ˉ ?±Ï� a+ìVeµló{RÕÞ絨ª#ì„-´W†¿Úû<ƒPÝ5öüÕùßË eIgN…˜^û§µšö�È}ƒâý#%±¾~F‹–´b_Þb?í¹­½taêbáþ}δéè¹7¡ó’ü²‹°v�T±.W¼w”ÐJe �÷Ê!êÌ4{` ­0.Κ®r[ÔaëÕ�ÿ,²‚pl±möÓ:î,òß ìƒÝ',�º òh’¹ÿî‹al¡“O_„;aËïάã_w%{€{a««÷+*”éá+¼Â‰_¡ä¿Ø[¼[C¡L7š“âûPåûÉ*ô}¨òýZ+ô}¨òýdú>Tù~�ú>Tù~UÚ*}÷— Í/�c“¦öîú 2ý¤ù%$O½pòHÊ”èÀ}°…Ú\>™~ Ò$ì…Ý[™’ÿ>à~­p+»b™6#QÃ7î.çxkÑŸƒ$ Û`·U_ž?I¶ÃVp”_žD`7°C“8 Ê'ÏŸƒ$ ;a+hE¸åIþ÷¥‘5幕�(ádøóåÏ#sš4Á0‚|ýyˆòç¡‹zQ]È ôç¡�ŸGîtj‰Dåýyˆòç!ŒuÂÂ�(ùïvÃj>×è–ôìå§f*_ñ0}%z¿E«úêü(’° ¶P­-«N"ÐÜ [e鬠Î_€" ;`+(�Üê$ÿ�@©ÂùQä˴6î‰ “~ªüE-ÑaÒ/B•¿¨Õx˜ô‹È‡I¿UÖr˜Dþ»�=Zµ†IÛÒ³WMÿòÓ”™¸ÄìË�å—5É#¹|ý2dùe¨¢^S±Ä Ñ/Cš_†VöŠj…O¢_†,¿¬©¼VŠ_¢_†4 uØz5šø@¢SvÆá¤÷KP$a‚Mü/A‘„5mâ‰@;0Á&þ— HÂZ6ñä¿X½&¾!Tçí¼é.sòû $ù-ÑüW ɯh5À²üŠ–èþ+�äW´Úà¿YVoß\”§ÈèW¡Ë¯‚`“hâÓèW¡Ë¯"mê…ÓFR£D  (5ˆåÓèW¡KÂØb}?9�’(5üQ“LSíºigy+Ñ_†( œdúeˆ’°¦“LD ˜à$Ó/C”„µœd"ÿ]ÀªN2My¯Y+ÍIïW HÂ{ ¿EÖ´JÚ� ö@Š$¬e”üw«× ªÏk–ç_¡Sxw} ¢üš–hõù5ˆòkZ�«Ï¯!W¾&›C|ýDIXËê“üw«W}6E½��䤸Tù�–è,èPåZ�gA?€2?Ð�ýªü@«í,èP&a�VÅíL¤Ðéðè=¯B?„*?LV¡B•ÖZ¡B•&«Ð¡Êk¬Ð¡Ê«ªP4òá:¯@¿Q&ØÈ¢üºVãFþë(!_×mä¿Q~]«m#ÿu�¯kÕlä[dÃhü*”ù« Ø¤©]K© Ò_…2©S/œ:’*%=@]“XLáSé¯B™„µÜYOþ{�ÕÛYßÈLã$ø h’Pê>}~š$Ü [ì2VI}�`'l•k½ôù h’PÝq2~}’ÿ½@©¥Þ5õ¹�ѧÈ|ý7!Ìo‚a“¦¶/VA¤ß„0¿‰Ä©NI‘�n TgŒO¤ß„0 uØz DJþ÷{a÷Vc´4m.8‹B‡?~ ª$Lp´ôkP%aMGKD`0ÁÑÒ¯A•„µ-‘ÿn Tý¨fþŽi§EVå¿M&ØÌ š$¬i3O:€ 6óß‚&¿¥Õ¶™'ÿ{�Umæ úiæÂüu-Ñfþ×!Ì_×jÜÌ�n`‚Íü¯C˜„ºV»fžüïV¯™oŽDzÇ7|“¢”q’ü6tI˜àÖ‘oC—ßÖj¼uäÛ($ßÖÝ:òmèòÛZm·Ž|eäÛZ5·ŽìHÏÞ‹‹ Ï;}ÚüŽ–h …ï@›ßÑ$)Èêô;È B©Ê„O§ß�6 û`‹Í÷Èé”üï€}@¹N·¦g_s-±ãòß…( œ¾ÿ.DIØ¡Õpúžtœ¾ÿ.DIXËé{ò߬êô}Q "]Ò߀2CKtúþ7 ÌßÐj<}Oz€º–Øôýo@™„ê¦ï¹c;‘û^ñ(z{ŠEjÒ5ne<ÿ ^ú7�x’N€ßŒÊVñ–Ò•¥³­|x+NŽ¿¥EA·~ òlÐTöt6µéYÏ뀺¦jàÄ�I¿…Bã>ÑÂRö[uÓé2>ãÿ~¯­‰è“¾ÑDßh¯´F·�þnCô£Û~$ ®"פâå¯|$çZ‹Á@rdÑpG2N6mºÞHúí‘åùÇãîã§ã'–ìGË�ŸøöÂã#'Ÿ.¦Fƒÿæì‘»#ÓþBn̸{ó cdz6oÿpltüDêè‰tæxj$(# †=²:Fæpœyâ²�¸œý›Bn<×S:Y!©ÁúU*\î“u�§ËAi› «o(d´™¶|ú`Þ°+m®¿xóúõË7Ê �© Â‹y€±â¬Ôþ6ú»�«š�{w¯ áRÉM?YÁ�ý°~Ué¼l-ˆeÏ3i31 æü_o´þîÞ�þÑ )ÖÅ/ß e†ô‹?Ô°ÒÙ|Õsû‚e§ 9ܸÒÿÕó_ªóU¥¶>(µ‹ºø¿¢¸N# 1ˆ'–ÔS±ªõÜýVÖ4<3|ÚI…�ê�°ù±l}zäÈ‹Cq6 ‹ÿˆÂÇ_6êð„ç`Ÿ“~îô$÷çÄ#@£\C¾)J¤Jœ^½<}¡ §õZÔ±%Ü {«§ }ËâE‰«Ü®Æ OSò9Bî·1ˆ§¦9Bõf`l¡¤)ëuÓŒ‘µŒr‘e™‹8¢6M8-¤²„Ü73ˆGQ–425 g¾lD^¶ÂnM _˜{ÀÊ] —T¾�û� âQ”/G(Wôðâ�n%3ôœA7•øÁ`ä34ºfðAÇÉ\2Ø„#< û¤ÂÜó-?[®¢‹ÛQÂqØãÉç= â̽ ÏJ§â”F=² F<’ÉÒ•î~×ô#8<<Ì‚}3²Š°vGõ²­"�-ðãŠ)AÝL-¨ ±@Œ°v·Â²•÷Œ¹re«¾•&wÙ"÷u â,[[dél-ÿÒ¡—)Wa¯w¹Ï 4!Ëš çúù‰…„Ö¯ ÔyÞÆEyÁ b>h6Â[£2®³  ðÜ <û€p®L¸máÕ–ÁÿE'‚¸�¾û…Ýõ5.´Ü>Y -Užpx ö)Qê«~ù ðìkòõÀ°À ^g�²¼©pg,3|ÒnÀ¾‘|-Hx“AÚúÁÉ�™€Õ½N+‰¹& ì²·…SÌ顊Z_‹ç1àeØ—J}�É©f"/~2�÷�ÀjTÊþrð ì+Õ/þ([„WaË7èüC+bððØB3–kŠ·}¥x×l­EÖ~öç’QðÎ Ù(M´ïÃ~¬LÆÓÀÏÃþ|22¾üiØ?--ã�ºa§y¢ð3À÷a¿/Me”¶ëÔJ„“. †måòÙh/Ta©›i:xY3Q¨ËÝt®¨ôµ1¥¯p¦�»ðÑŒ^à Ø'’)|;Š…OôL"s±ÜY/‰²Ç\CÎqÔk*·.T,{ÌQi…;ê¸g Éÿðláu£2«Ëá|T…ñæÔr”Eîë”e•¥Cý—m â‘L•š³ÅÔZ¸á‡:«÷üxÜÝúndáìù~�~8™ôÀ;¡š)æ SÍâý÷æy¡ˆITÀ['Å;ïD³¸ö^QÚ«~¹8{Pa‚T¨yÉÝFàlù}×uƒ"’ŽÀQ.ÙVé^;ñ» | ö[Éè¶eR²ËNœO¯ÁÚ»Pö—� ØF2âΞ•ï¦A곋8œ‡=¯\À-²_¢÷3À¯ÁþZ2úÝ>)×ë%Êyàç` ˜Wý²üöÉÈ×~ûCiù6꙼°ôx{0DäëZñð×#”$t)eØú¬©§Œl6èa…ë�ÌxÓŸ7|=娾aÙz.k¤Ìùè¤S8T�Vp¹;òzTvB¼û’|_ì._l¼ª_î^* :�ÀVØ­Õ—<¹Û¨·¼à �ŠI‘ŒÙ Ü [lÓ�ú}ûP «Ñ;^#w:€ƒ°…ú %IÑW¬�ôY:zŒh<³¤¨óo"8¼ û¦4ÑV: ’òóF6Þ;ÅË«7RBˆ­°…JÕŠ‰» тѩnÙ~Ð~uh@´X¡ÒÊzÉ /k&n�äÄûió¬TàKÚÍIŠÙ·"¹¨¸VjKzöŠé§æ¹ûQDë pöp2ý¨Í“ -@y/°vŸ(åU¿Ü�=Rýêj?¾¸ºÝ®D·" OÄàðìcÊź ù.6r%n·€`?HF±M“,sÞç�×a ou_õ˧€a?LF¶/Á~$-[þÉnòÿЀ-4h/ݶA}äxßePýcûWÐbqÒcvJ‹SÚq&::ðìCÕ ¹ëöÖßÄÒI[ci¿¸§ÇË‚á^lþžñ^€}Aš_=õ|ø¥sr!ŒîÕ?']{â´ Ø »³úú!w›�{`ï‘Ο¦hku´¡šW2De/°¶‚}YÁgqØNB‡ B¹}Ykµâ Ñ'& ïQáO�‚ÿ7–EiÉݺçIà,ìÙdZ÷¾â U|�·Ù œ€-t„¼ì/·S°SÕ/~än+0 ;]ƒ6Ÿü›À ìŒ4î•Ý~”®åöÆSD•r%mü¿�ådFíÖàVØâçæâ: ®ÃÉyßÏy##Y+c¦–SYsØÊZ³ÃŽ;7b¸¾ü�7âùÆœé ÓÛô™Os¦k…AŒ*¾Z… "ôJ»€·a߮ګu^iˆå<ì-Î ðžæaç¥x³ßêrráÔÔ„ndýÉCo^fÈ>8$@õ)ð«°¿ª¬v©ŸÉXsy·\ýBïö/+¬ÖæÃ/•uÛ üØ¿"-©UãÞÒL(Ñß~ö÷æIÐÀ9ö\Çÿö(t”¯¬WI Ø|¢ýö’¯äÉý2ˆ'i‡‘1ʵ5j4·_Ü[h9„¯7ò’��9ã$™3}ºåél]?Ž\3œžvÂcaœyGwOÀÚ¦Y>fÚa‘Ø\Äå ð"ì‹ ólÑtg+¸= ¼[~Eskqm†»/IL.oÁ¾¥²`}ôk…i0Ù‚ÅCUX°vRÁJ9 9÷f³f´‚ΙYƒ(=„ý°ÅÛêkAâ4¢¢´„¶º]·kfÖð4ìÓÒ™%¶{ˆ8L/À¾ ,{ž}ÛÛšy4|öÉäÑEà›°ßL¾AîgÄ#Ic‡|±Šr;D¹€�J'ɉN§V\£ïÔ£›ð©…ÜíöÂî•Î&þYòߌW[÷'¯Úa"F5§ ´µYÈÓ¦êÿ,ƒx‰gëLÚôR®ŽúËxïBB�Ê$}ce {ù„!Ju â,ì{déÐ"wƒxÕ=ëÃ(å\„ƌ㯠�Ê/ïu&÷¸Ü0 YL¸öéRvZ÷ò¹œã†4˜³*ýÌa•�Âqoêq·Tòfä2�ð2l¡³Ô¥�Ç¢eè‡WŽ" �j%¡Qkݤ�f`ì¶ê7iG¡*ÂvØB™ä7L…ÝÀ½°…ξTaAœú€#°G’É�.à(ìQéÜi,ÜŒÃÝó "G€§` ¥J�¸ÅVA…JÇ5õ´•ɘnPéDÑOmÇ]0²ñ7xÉ‹dâ Øb³=ì§'-;ÚcÔE˺‘Í:K�úö³–ïî²nçfM—"æ±[R¹w@¼Æ„'aˇ^š·RóaZgƒúÝ š…YÏ·ü<–¸Kö«rËå8x2½EIÎeåÒ_ÚH èžé.šº¿äè¹¼›s<Ó›àåϨ$\'^§É„¯—íQ¶70(×#Ò*ÖFÂU�#™Hþ’¹yE§]^�¡K‡ãæS3ªpÁ §xƒ¿¥‹³¢al±^Tæ8ƒ¯À åÁ~zŠ^åÒ…ëwôƒ^$5mªvÌ´(3øC†ª°0&?¡þKøÖÜÕ#ǰ&^§©¨‰�zyª ¢˜HQÕ â²£y'äŠn5²á‰DÊdȲ}±¤D|.O+ñ+úê3GÔô‘’½eÛ7ž†éVˆµô·]Ç7SAÇÛ˜3,Ûóõ;·¯Âx;ºµŽ;=O3x ö-e]“Ía:m…ꈒoR“ÊÊ[É}ƒâÃV)g�1ªI�©Faú zT„3öy—jÀìrxãš—3St¯³ÈÆ´³ KÈt3j7Ò&"§€“°'«>Ò&oÇ�g`Ÿ‘ÎÁºS¼J:Ë<çŠ(ÉãŒ�ãÉäý¼kR ç¼m‘šJä…*‹š¯  Æ�™æ®•ÎAFç4•ñ�'/:vx ‰^dÖH=6ƒªµôÖµ¸U-PG‰áï"œíóZ±ŠaiKAáAŒ¼ï,„»H}Ó£Ë o|4ï­DTž—Ãw)“AÔ â}¡ x ÂW`Ë÷yDˆ\„wBõ‡Vw0éõ(gøA«kóø‰Y#° vWõüän#°v·tmFA¦ñ˜»‹àAØ¥Ùì|Åv–ì 'i,ä²Ñ8Ÿ{`Æœ¹–\'uȶý̬f-fW�W4•}Úu:g*\Y�x•êug+Ñ©°‘†h41ˆGY®°‘†ÜÕ·iArKÞþˆÞŸs<‹š8#4Ï~jž½mºã¦£Ù%#—3ƒQF0F ¿ȼfàYØg•eÞæéë†k—.°º ¼[8¤Ì3wÉÛ9àuØ×¥³PhRœ(ÜNÞV–-õÓÁØ3¨THÝ>„ý0‘\¹|ûQòã©Þ¯â{„c°Ç”å×–é[ŽçÏñߣGtNÏÁ>Wõš„¼ž‡}¾6õ;Q¸¼ûJ­ëw"s 8 [¨ÑáΕø¹SĤëwr{—Ag-Ò´xxv#kú¦î­à¢e.…F´ˆÈŠ—ú Ð%”[åe?½/¸w‹`ÿmÊ 7ÆE÷lé¾1›Ïdxl8 ›àOÈÌ~'­†[p£5 _w¢v}Reõ`�º)3GI™‹¢ÏÄQƒoqr¾ ž„ð‡¥ú'"û ×bw ø ì„.…¯ŸŒ8 0><[h2¡ì/¿¼[ÝäwÅ5Hr7¼[~ö[$ì!1¸dlÅR}¦�ákQÌŸÂ~šŒ^·N2Äh?Z°-e¢½\†½œŒh§�ïÀ~GZ´uÜÛ2Éÿ»ÀOÀþ„4�Ö °¨3@û\„¶xMG±v«ò¢´5={ÕôÅnl!fƒÀ°º2«q²È[€upö€’‚D¿Ø”ºœ¯ ‘»ÀqØãÒîÔ£ƒÞ¼“Ϧ£½e™Œ•²Aó–1¢6|ö«ò}ð¼�5=O_vòú’aûz­;EU íÑ„�¡çŒ9ºiÀà¾Ãº>øDдíycÑ Ùa¯qá|ÄrÔg_Í5óžÉÝï¾ Îw5Ùì§'îÆÝ€Ö“¼å†GéìI0¢»lŒŒL/Dd-o^¨¼„rçÖªÓ³#ÆÜU »|¶Ê kT� “Ú¤/¯Ãê.–ýå3À7a gà«ÉÝIà lù` ü§üÉÿàCØ¥yl¹cuÝÔÉIçU”Â-°·H•ö[»­9Ûô}³¿7=k éEÚÈ”î­T„*nÜ|_$<;�øÉ䮨[>ØìÎp;³TÚÙÇþ¼ëäçæ¹eDŒ€rah(ßNÈN™¼¦E�/cÄ#HG«˜O–WïC¹„ê–W7ê÷<îMÐ÷l€-ß@8ÎÕZ�À>’ÜèVôE¢Ûì…Ý«¤I¢_lŽÁ«~íBî�Ga‹�™c?í§~`* g­Ìý.º3K‡Ñhn1•5<îsÖÄòðMØbA•Êî5ºtaj:äÊIëu-ÚFØ»MYÞm Å|çX˜b¼¯¶Ã–´Àß« ÿ»�°;’«ßÀ«ª«ûõ›¹h·\vy0º*ö0Ç.EÂ_½Áàì!åU´è\9±º|öËÉÔ΂såÄtxö9%3ýâ1à+°U®T¨˜ÉÝ0ðl¡)zé¹rbp]+ޝk²Ñ2•Ï•µÇÀ%ØKÉõ&DçʉîàèÖÊ2¶áîô½Ë•r³Òn¢²Ø [¸ïúì""w»€=°{Œsƒ–Âv¢€ÇaWˆÂr‹†•5¨D{�2è/qËŠ¨êÀk°ÅVª„šŒyè…P]“qXŸD…½À¬áùAåݰ‹ãѺmÒþ]Ã]æN®yG`�$—\’ÈRš\B-¬Å`õZØæôìŬi¸ÑÎî–Ⱦ[h_5»m²„ºñvà~Øû•´¯ô‹-Àã°�W¿j$w�À°å/YØvñƒT¶õ|nŘÛ•¸‹81< |¶üÝoãÅA5¸† wY¯6ê÷°j÷êÏšÁ_†Uº™æ¥ÿvTŠB‡-ß‘9´1Ë �M× ìù uRa¨é´žÎ»4 CÒºU­"-Ñc�%” Ï~ºg* Š=çý›œKGRáÌ�À’G¤÷ÀÞ£¼ÆÛâØÃæS‹¿®#ZcÀ ØBg0øëºÍ“ -@¹8[¨5-û˽ÀS°¸Û“Ü힆-·§È:31˜žƒ}N¹X·Ñz†;1‘63¦+¤Ø7€s°ç’QlcD<ä-Àú:ð5د)íUà@îßf�ìà)¨ëMÛËGwÅøQ세6²KƲW¸R†»ÉZˆŠDˆC°…ö�–õÚ0cÚùÓ5ür¹öüÙ@ åÖxKÐ'¬Þ– V&�Xg›øž‚­rqx�V©er%{îíÀC°…kƒU¿Ü< [¨XñÕ3ä®8 {RZ¿ÕŠaD,ÏMئ²6c[!†‘ˆ4>¥EÁ‹÷ÀꎗõúQ�Œ>½Oˆ{a $—ìd�ÿ.`7ìîäªãOãÕ Ÿÿ@FŸfp¶ÐvõæÄ‰ÚKÀ»°…ö½óWÖ2sâDwx¶Ðà½ì/Þƒ­r‘ B=Mî†�¯ÂšŠ—ž'¯™P9ŠE+:'N¬rÀ%Ø E3œ'¦sÀØ Ê¤jŸÂN �¹{¸ [h*^²)"ÿï?†�Œ>•ŠÇa�KÓ dôY0 |�fñ(“v…¸9än p;ìí5©…‰A ðydD<ö dDîv»´ç:�Qì^ÐdôSQ6‡X㉊Ÿb°zÛwC¬ßKÜ�Â:Áß�hšd™ ðnöÁ:ƒ^ö—[€Ç`«~o‚Ü5_„-¿…¬=‚€‚ûÁˆÔqà5Ø ßü\$ûÕ•é�UÇ7ý%GÅéÍÏ18 {8¹ÔúÁK¿_Ûx/£pÈÑøR ÆêœÞì¤Ó›)g�ú¯ÌÑ5Ú¦ÊÉ÷ç´hØHØ[h’'äÙ&›|Dã ƒx’ÎÅŸGÎÅX#Mÿ\ÿ‚R‰×üEÐ%Tw\óTÙãšwn_ š’ z¦³%8µŽß<+|5“ ^•{ÍìË Mx ¶Pϵt;y¼fæ£N3�Ó‚q›é ê–í™®®¸zÚ 2ƒlšSä>pðK L(·�œýô…€W0 /Ð ×0‚¿cvÁ;áæþx§_IÂ`ËGt®î1Ô¯‚'á0lñ9Ȫl¹!jSÀ�Ñ1Ô¯¢Ì^ÑTC¥_|øª–Ø1Tr7Tw •ÿ ù¿|öëÒ<äÏöý2Ša+ìVåE©1={9bp$"öðEØ M`ÓñÐ Ýì‡-´ñ¿ì/w�ÃN`òšÜ힀-߬u êêNÒµ“À»°…69–Pì¡~�íØC«ÏÏYñÜEìW ŠušŠè¶ •ûM{N�ʱ[À�ÍQ9"{ x]SyTŽ~ñ 0Á£r_Cá#¬åQ9òÿøP«ùQ¹Pb·ÀÞ"UzØo);*÷¾H˜àQ9r×|¾ŽÊ£ üQ¹Ù™‰µèx\Œ •û:”KXãý_g°zû/Z¢ÃfwâYîFéëÐ á8ìñd¥í“+È Po„-4'Xö—[€°U.ÕV¨eÈ]#ðlù©¥j”#–§�)Ø)e-Æ–ÂA9NZ¿ªEçâÛ`·)Ë»�:#÷«Ñ«„¨î²,þÞùß ì€Ý!Í£÷ Íô9 f!{½Q.H�“ç7�F„½°{•‰h»µ°`¦-Rþ¤.rËÑž„�ÀU5ä®8[¨R–TùŸž‚-V! µæß„ յ懞ñ¤%gZ}“ÁA؃ÊÛ{Ñ3kÄêp öT2Í¼à™µoBû„gaŸUÒºÓ/¾ [(Â&_¡&wCÀW`¿"­f‘½GÄàð&ì›Ê¥*µ@AÔÞ.Â^LF¯2 Dw8[xÇÔª_~ÇÊTyèt ÑÞ>…-t¾S²%"ÿËÀw`ËALì å¯Eå#ÄqØò ºèAËo�áspÐ’h43ˆG™´+œë#w[€ÛµZ´$-Àçá %ñØLð %¹ÛìҞ냖D±xAKü å¯GÙ¢ºŽqKIÇX`þ¯3Ø[hè½f¿bGÌtÚYò·;xne%‚'€S°ê ·N®¢/@¾x ¶ð!ÉU¿Ü|vcr×|¶|Çx÷ªÛÃíü¬éòubu ˜‚-6ÍÅ~ÚC·Å‡}B´àYètp×GߎÊIˆ=°{’«�¾—„ƒC¢ßapöpr©õ]¤Ðw•¦–Ð"Åw|n‰¹CÀ�Õ!Q"ÜT{H”~±x\Kì�(¹k>߇D‰áIàÇð�èoD¥(Duãʼnþ&È>—‡D ¤ŸÃC¢Dk ø19$JTû�#šÊC¢ô‹½À‰’»½ÀÚ%“ÀsÚóyH”¸½üø%¶×�j‰Ò/^&xH”Ü�ZZ͉’û·üýí¨H„8{HY†­}HôCøû`�Γ‘û:ñ(J‚µ‰þ^úwk›¿‹—ŽQ8ähüR ÆêmºbXY*K AUâqRüž� Û` Íñ…ÔöɦÑè`OÒ÷÷�Y1ÖHÆ¿׿¯”Ææ‹8 ÇÉæû`@¨~™é£vBTÜÓCtš�m°…Ì×@“»-ÀvØò;Ãtl!ŽÖ*©?ää}f' ¯‚ˆÝnà Øò#ü×°¼èÔG8òän£ÿò!l�Ý’|ùú\ÇX£bþ‡pý‡Ji´Pq §‡æ6–yiý¨ü‘ÒLj O8ùAÿ�öÇë‹F6ozÜÿ>ø¶Á[šb?í ¸­ŒÏ¿ä:AÚÁßq¾?1ÂØ=Ò$w$ó¶ù$odõ¬iÏùóÜ©÷C�!D]L(›³á9ÙªáGàó#¥9;8ía7}è–Íì 1‚årš;5 –„ƒ°Åv ²Ÿé¢QNô…¼‡˜BŠüÐ#<û€4ÕŽþè\eHŽÊö¬©› 9Ÿ»Æù DØ[¾÷·ž¢æOáœp=ìõʺ:u7ÎóvrˆH°vcõ;9änp+l±ã?%2À]ƈ@°v³4‘íVg‘&Ÿƒú€?üÆ?„4þaáû!J²êv‚ZÉ] ªÑâÔ>íi£Š•:äÏÀ‹°v·4Ç“˜hÖ j"+`G}Öë)u6J*X'£§­LÆtMºðs9Ç_aý9ž„-´a¿tݧ?¨úƒºÕ·Rù¬QäîxV´aF'a„­AÉ ðÒÿ P&‡=.MŸâ0P5ëåÌ”•±Dñ—àBØ »5ùŽï?‚ëk;¾ý+0 |ŽÆ·D§˜àø–Ümªßî§-{%§ÖŒ¬kéåpÁØ @ wOÁ?ÕRiUeç¥ Sr;ˆá›@¶­0+׺Æ�èËl~ Î/ïþ/Ê}Õ/_:°�d~˜ƒ�K¾$÷OÄó\ŒÅþqTBT7ãN¢×1 7e½®µœñ=xû·d=Ë%¹¯cOÒ4þm¤@ŒUZθukRF1Sž™â?Õ¢±Ñ?ÕT,gŒÈ¦Ñè`OÒ÷?CfÅX#ÿ;pýïHÓ(§›õA ÇIèßep3l¡_y¯3¹Çs¼®n�½E:7^ zPV+çñäQBЉ›ixÁ€-›u–¼ ÞüwQ¤ÏÀ>#œƒ/Ê êßÓ¢i‰ŽNòÏ�y„ê6þnÒiü¢s&Å?c°¶ÐÑÚ7y£\¸›» Lü€°Ú×u� ܘï„}PI˜~±x vûâþJ áiØòûâêE¤; <[¼R©$Ýö•Ò;ÈL$ àì„.‹Ý¹B¿"š‰ö+À‡°*ñeàSØ ÜKîΗa/K‹Xds'1xøì÷”˸�‘±x”(âø-àÃþãdT¼£¨bÑ@QÄú‹ÀoÀþ†2øCØ?LFÄŸþö�’û3ˆG’Æñp=ÞÒB‡âl�6–=�Ͻó?�ÊJˆÇa—æ¾# ߎ3,~Þµƒž4'±ÿÈÊ­µ—ÝëV¢±µˆÓð4l¡€`5Pà=ÄÄßâbß „-´î^ö—w'aOJ‹©=ŽÐfÑø¢áZÆlÖäž”#Rg€waß•&wñz™õ»Òe²A¬ˆÑÚXÞŽlÇ6½=Z�â}‘ÿ%JáEØ¥_¤É5é” yXû_�aì&iJ‡+wrÍ9Ë£ÍFx;ý'ßÿ58†}XyŸCÅÒ1|øöƒdªé¥â|xöU% ýâàCØÂÝñgïo�»€�`?’–ùF}Ñ2xKQx ˜†�V®`áó{ÿ¾­~öÀîIF¶¢ç÷ˆjp'l¡è3e¹¨ÃÖ«¯Ö?ÊÐ÷ÁÞ'­Ö]ºkÍÍûº‘¡8%¶e€(õ�ÃëuVˆ¸öÑm÷ §Iàì©drëðeØBAG¤äÄàà Ø7”eÎ3Gj^3ƒîMØf2t˜��I~°IîçÄ#Ic_¿gšÅ#ñY=º�‚&ñ¸{„ÿ›(ëCTWùlºgû÷ÿÿÿþ¼.BÅmez{BqI‰ZðØB÷{ñ·— Q7O 4)‘ÝÜ [8>Úª_n¢>{'wõÀ!ØC5©ƒ‰Á0ðì#Ê%ÛÊHVlZŸø½ |¶ÊËKª¦Û3À«°ÕŒKèO¥.Uá×íðl¡AbéT¿…úyG<ˆÐC`vN𨩒yÅÕ‘ü)žKx/g¸ZOÝÓxÇ5÷Âýÿ6*5!ÊÝrIåï€lãÿjÑÞ�ñÒÑ*ê¬ÂÂý„ T·p¿NçL…ÿhâQ\9nCåx…BqWŒÄMÁjJø+ÆÆ¨b y °Þì‚Ý¥¤f¤_lî~ÍHîê�#°G¤Û¶r‡¨ÞŸáoã‰Ó(ð2ìËÊÆYrƒ`ât x¶ð®e¾ìº|öëÒÙµ1œzÈ�7€a M1–ïy=ó†Š5³È.Â^L&‹—` mä(ÝýÂ}Dˆü?.Ã^N®)ü�£L ±†Má¼«ÓÆ QÀÞ‹N^`ë1<‡=žLƒˆ… †½÷À>Ø}JšEúÅ&àl•Ûú*brW<[þ†­è”{ú;¦ëµ‰Dè4ðlus�rm"qº4`ÉäÕMà,ìÙÚ´‰D!œƒ-6÷X¥6‘ˆÙÀOÁþT2Y4ü4ìO× M$ÿŸ~ög“kÿ“(SC¬a›øŸ¬Àê´‰»KÚDñüÄò0ð<ìóÉ´‹»ØvQ4 ?ñÞ<[ø&ÚU¿Ü¼ûBõ 3¹«^„-¿½fg¡m ÆŒ–í›s&wãHŒ._ƒ-¬SUt "òøö£drè>ð-ØoIçÐ&¡ q0€Øey"¿XJ¼€ïÁÚ]ÍŸEsÀOÂþd ZDòÿ)à§a:¹ñ?�ò4Ķˆÿé ¬N‹¸-â”÷ª‘µø[Bb× <[hÍ‹¿%lŠZB0à½Ø»GI H¿Øƒ=VýÂKîê�Ga˯ßRhÒ÷ð4lñ«ÝWªvƒÈ}¸Då"ð ì+ÉdÌ$ð*l¡…K¹U(rÿƒx’ªTÿ:ÊÅkX©þõ ¬N¥º •êK†wÑYÈeM‘1Q<<[åAɵîùŠjV–¾ùÀý°÷+©^雀§a«<ÆQ¡“»zà$ìÉÚU¯Dã ð l¡º¬¬~7^9íwýJ\®oþ�LÎ\NÞN¾~%÷wÄ£èí7‡õªõN¹ø£ÔþwÀ¼ ÷u âIª�ùÏðæ„µŽOðŸ1X½øR{‰Ú~à(ìÑdZñ=`Dv7pl¡ý©e¹x¶ÊaL…º‹ÜmŽÁ+Hï]$G�ÇaW.Yù½‹Äï&ð-Øo}t{x ö5eº�°XÞ"w'€³°g¥u[ǽÓ�ü§€iØâªZe›Àÿ\‹v÷ŘðN¿ÿ"*q!ª¼›ó uò_0Ø[<%ªÒµ>àì‘ç½&!²í@¶®¤&¡_lŽÂ­~MBî�G`‹í™/ùt0ÜK,�¸cÀ°Åî)'ÖMaˆ²Jçþ+ŽªˆÌàEØB+[üùrx ö%é|Ô w.†ÃãçÏšº¡g­ÀZš7ÝàA_ÛÌF¡Ûx+_bz˜ƒ�“f|1ÜNObòŒwPxá> Äòˆo+ðò¹œã2·aϩǦÍ.ÿ‰'Du¡êÎó‡ÿ|ÖÁЭ, iÃ7†3µO€×`+ìÖªTܫܮî€-Û„ýô K ¥e×Ä¿¬‡1XÒ¶Ð˧æQ:¸%DwÇa�'×ù/¡ÂwDþK«×‘׿>à1ØÇž÷Þ‘mêšÊÞýb ðEØ*¯M¯Ðê‘»FàqØb£à’O…z#Äáð4lu+h‚½"søl¡U$þ|™NiÇûWlïYÝá­i‰ÑËÀšD¨—f“¶a;U$E× fÁ5�…Áè–.Ç6ƒÎG6¿`ë9ÓE¬±ÂíIÜ�Åÿ1’Gˆ“°…–6Êz]kæú?‡·ÿ°F3×侎A¨JóôŒë,ˆÔTÿƒç`ŸSVSmù¨€o++âsxöÍêWVäî<ðì[Òù¹e¹‹7Ѹ |öë¹³S¶°ý×ZÔ‹1á9²ŽöÏ•¶ö°kJ±Œ-ÏË ]îòÏÜ [(6CR§>àˆ¦~º¬Ba"w]ÀQØ£Òù%²BB Ž�Áê¡Wë;¼[x•�/‡^^‡}]:‡ê£0�™txö]åÃ=¹SæÄ; ûÝd†z§Ì‰­| û±’±ýâ›ÀOÀþD2º½|¶Ð&ëÒi6îö™üø)ØŸJ®Aüo"}‡¨®Aì Dæá6ñ¿a°v�êj·°Wßã¯v‰ØAà ØB«|ò%w:ð$lùË"븣Å�ÿqàl¡Ã°¥s}"•ÿ¿€|ÿ…´”“8CF,€ç`ŸK¦Pr†Œx·Â>¨¤A _Ü <[åéº %ê_0xö…4äÿ"ðlù¥·þþËáUIpÖœ£ôÖ‚™¶‚š/»ŒÈ ƒÿÿ�°v¿òB'µÒÿßBG„×a õPùKšøÜ:‘}xö%Å‹~qxö�ê/r7¼ û¦ü8!&p·ZDâðUدJ“¹®n|°<=ç:)Óó‚žOð–K%mÖÌÄ×,dòvxc¼ |˜û¨Üÿ%Žðl¡:«¬×µænÿkxûï€5š»%÷u âIª÷üßãÍ Õõžu}ÚÌ™†¯� ‡; ŽÓ‚°m’” w™»Eùï<û@r‰ô/‘0ÿRi"u곎ßWR'¸h:gòüKÕ 1ÖŠÇ#s±1< œ†=�LK&}±qž†-|pgÕ/Þ�­îèEÅ�ÜéÀ»°ÅæšØOùû‹äÿðUØBmYY¯ 3q\ériðïEB×þ/ZM[r_Ç x+ EãÿŠˆ±F©ñ7pý7Jiì¼T´ñæ§Lq›?b¥¤¢Ìþµ…6!Ü{[õeö¯‘„꺣Çt#ë9º‘J™9Ÿz64§d&uLƒQ‡]<ÖUœ?äÍÇ�ï^„-X«…º/³N0Þ@oš—Öÿ‰HØ»E¾â¥ŽËš//Ïÿ¸ÊU¼ì§£æ¢iS™µ�¸Ó¨Óx)ìÒ.Ó_Š/Èñn¢ýÿ‚)á(ìÑÚ^¢sx¶ð’á³^rwxöYùη–Èÿ9àyØBÛÔÅ�ü›d‹"w‹ôpû‰Ò¢È;yI^éÿbŒIƒSÑ|eÉ�ßVÔDçg¨~¯ùæÕÝ:0 qŒ…î½+í4Ô¬ 'âTc¦œÄê@Œ�à‰Uu³­!™N`Od+½d¸|%ºÛ Ô#[l’·t ³8Û] ¯[ 4#gØÜç4Bfû€§#[AW›»ü­‡hÖ+-ÏûzÖ¤[JKïx k09gF tÔU ZhºÂÔÎå}�™�å|‘ xB¹cô|�·×âó2ð•È&¬Â¬È*·—€×"[ìT@Éë¯à�Õ¸¼Ù‚û(?ŽÉêœ6"41ásHë6A�„µ‹‡ºg0~’zÄÌ ÕÜÙbí_I!wõÀ�‘-¸8)%Lr¿«ˆñ“”0ë!ÌúÚ ³¾U 3ÜÒ`¥H5f=„Y_[aÖC˜õµæfssm…¹¹U 3ëÌY)#+@ª ˜ 07C˜›• sg¸xwÁq‚c]‰W«›¡UÂ~hU|W:·V·@«[j«Õ-¥¨X«[RóÁ0ås·ï[ Ö-Ș&M°"áS먕° jmK¾¥ÏÚ‹?’4n÷‡sÝa|/g¦,#«ò'&`ÎHÑÞ Û\ R‰¬'yÇ'¤ù$ŠXæe oÞôx·¹P2„’'¼ ÉßN®Ä5Â}cmK\c)*.q›2í˜àÔlEqk­~qkDq#Ü�â&/­MïŸuòv!­ oî);â´8ÙÚ€4·maé[2\Û²ç¸ ÐV(˜p,´ô&V€šà¾©¶h*.@.¶1s1ÚÜÙ„U(>ev³ßJS¬knJ—÷U¿\ì@‘îH¾%ì,büHÒ@ :oÚqF&.£áÅrlæP²Ä*¡‚Ý ÷͵-ØÍ¥¨zÜtëæ�©û)Î3)!™à�ÈÛ\É_¶·‡eû®µ`^ z\w)oF)'Ü‹R.´ã¹ì/×¢””ÌVÝÞÕó�…÷hŽ˜ŽE¶à5 B%h;JÐöÚ– í¥X•Ä{ª+$ÓLpæa;4J¨næAF£ô�]@=²…4Š�!ÖP£-¥¨X£›ÓV&CY$Àª ¸"R ŸH[ Òȧ’y²YpJŒX´»"[pË8ûé~fÞ!o[t2ÌŸ#IA7ÊL9vš›i+´L¸Z:iQi›f8Bž´¦!m[´s™†x\ÅK¡b�Ct!ª+ö aÔñð`grìd0îé5++ÿë]cI€Pp7T_�ÑÛ*·Û�øGò#¥–pf|6ëÌzz(e�ÔèŽlBU£ë÷®]«”R•ö•#ÀcšDXÅ Ta?¹{øbd‹/I�n óÆ¥ŒºsûšNI‚ ›»n!nÇ�w"[ì\»XÝ‚Ãw!ª«[ZÇ6:B¼œãÞÕ¶‹Á¶ÈœÆ/{-•®‰ ú^ýÀ#‘�ÔMØ[BÒ‚œ»€"[|ü»ê—Û�c‘­àf;î©"r´ˆñ£(SÖˆ�³%f]JŽš}tÜ @îëŠX£ÈëÚ‘í²©Q!<3 ¤´Ú³öOáywmóa7òawmó¡©Ñ!�TyžyV:[ê€41~Uæ×­ŒÞïÒia×¼a#{Zýìï�æ àöÒâ§eúÙe}R§ åÂñÁù¼ïäÜ`@Ðÿ®Þ§›O ºÛ›Êð¾Û¼á}¼Û}ešß2“vlß›w–*¸^|ÙüzõÔ¶f¼QÄø‘ä±£O¿Dû†ÃË£ôLÖYª¸µ"3‰Qno<ûéh0ÞÕOééÙ‹Ññî~hmb"Âþ�A½wbÁ\pÜå‰ÞŠ=Š´»@›p´Gk�±ÝàÑ-]�°Ÿéöš¤Ò]c6köi$–åZ^PR ø“«4 uÐÔk�\ð£¢äìÓïy´3¾pŽ1:ÊBcš)3]:˜°ölQEÊû@™PÝ©–”��pÜ2,(Å+ ¢ü¾sùÚå‹wõÃú•é›×Ãl×_{éòôeýÍ[¦od‡_³ÒþüýŒ~V øôâ¥oà¥nH¿Tì1ï6Πô� àgÙ–„P°`<:öÓ]qä†&?7ÌÇ…¨.šMWÅI¿à�hÖi*f:Õ¤æCT—~{Jà J1<†„èG&^g"˜pŒŠêÌÉ>q�Ùz³³5œU[Yyꆯ;vªb¨‚Šï0€w œÄ;LJ¿Ã�²•h!†=*ÒKAEz÷òêjôí4½A§w¿Ù5éa¼á¼™ØÜûéËë0 H§ú{=Ów<#èô.š®g¥œ¬ãÒŸòöcÛY²{*�ðB„/ã…^VÑ4¬ ý!U8ч¨®iPY} �áP�«�aðVZ}ôØt5OzvÚ4Ò«z©ªË¥ùÉŸZ£à1ª4µZÓ³—,‘®(¥øèˆ¶‚X«² ‚æ÷¤†øcZ4Ä'Œ§0„v¢ññÇ�0c5.gäoãGQ}’sG?xP_ýõÂmšÕžò9 =þ,ôð³Éèá(ô@øEèá‹5Ðù¿ˆñ“8�cH ¢m[ŸÞÎ&8ëô"Hn©mÏÿ¬ÓqÐ&íÑäé ð8¡4O•Ï:�ÍøZ¦ZÍ:�ƒÇ¸Òäªê¬Ó(ª›u*?`bîZL`êéÞŒPÝ€©‰½sž›Óip"ÄùBINͺΎ߸Ya b3X5K³º­ë…nÀÄ„á=*üéQxÅö£èŠí~ŠH2®,ÐìÝ ž±ž› 9y˜¢ÑôÊùkw. ôõÏà½oã½nK¿W?‘³ BX"uÒD o˜I<Ì–EÊdG”ü|Ï�/!fTœÖ’+:çÁéüsUt.€Õ¥Eç&ÑQZp½'Ä›x«›µ(8—@äÒǤà\ßËJ ŽÊÙ¢+`HXËQìUð*ê*%;ÙüÞ�ðZ“ÍSx3Bå“Í« Ú wmÇýB˜`QÝdó]ç›&çæý xbfNl�cé¾a‘ùúk BˆPo„’TTÏ×_K°ìy®j`,ƒ‡XË {ŒŠj`Õóõ·Àò–ÒüäO-ŒbT”Z æë§AŒ°ÄZ…ˆUc¾ž�F`Âóõh·B¬e9#ÿ{‹(>__! âÌ)ãºIpW©h¹÷À’ûº"J^ú’,�{Zˆ(ˆ’ýtÏÍðÞ¥ SQ#¡Ï™6E¼ó&t^‚¯"Û^•VîZwÍ4¨¥è@<'É×´èˆçk Ù$J²|iªt΋ÜÕ÷F¶ÂÒTñôÒkÈBu;œ¸C®‡þ»�=‘-qsj]i4I\;ºî>„AØatT_÷! ÂNC>FI÷¥!�=À½( (ô>z¿Æ ½…Þ¯ªB·ÒÒ[6¿`OÙ‡“áë(án4�ª¯C ¯k*cùôõ¨d„¸¥EeÍ]A ¯C ¯k*oŒäèëQÁ±…¥[¹@ë1«ÈIî h“0Áèo@›„ê¢{h“ì¶E¶ØYS>m¾mÆ'æäCDòk“üïvD¶`±–6·„s.5ç›Pç›Z¢qDß„:ßÔTÆP监,BÜ ©¨l9*¨óM¨óM¨b�°*äÔIþ;�R ÇGu>£Á‹NÞæí|Î@¡3Z¢�Ï(tF«qçs&Ê’ì|Î@¡„µì|’ÿn`õ:Ÿ-«æ¬9i>€J ¹šD“‹O¥ ÒH™zM´ç#©ÒQ¶„¨#«ôê«ôTJ¸*ÝW•’ÿ^`_d*Vé¶P¥…uCNŽ!QÂNHTÝÄmE‰>„D ÷@¢ò“¶%{�]‘­´ˆV�èCHô!Šè:5E”[¢QBÊ–Ð�’èK†wÑ¡ùkþZô$ú(Y‰>‚DÕZ¢� ÑGÉJô$ú¨Æ}‰>ªªD·¦g§àþÈ B^µ­-sa‚µý„AXÓÚžì&XÛÏA¡„µ\] ÿÝÀ­Š[[Šç‘8ÎC „ Î8ÌC óZ�g棒b‚3óè¼VÛ‡ù¨`„X½‡V çó±$ž™¦•ZZ¢Ë_Tji5^þ"=@]KlùË‚J k¹üEþ{�U]þ’X[x%LpæámH”°¦3D`/0Á™‡·!Ñ·µÚÎ<¼�ú¶l ­ÎÔíc¨“0Á©ÛÇP'aM§n‰@;0Á©ÛÇP'aÔ)ßÍáî“ûÎ"*º�“›F©T;ë@g}uפ«]�¬Ä¬ÃX.h*fª2ª´Qšm-ÑQ¥�Òlk5U�=ÀG•6”AXËQ%ùïöhÕU îGw MÂ÷£;Ð&aM÷£�]À6-±ýè´IXËýèä7°C«Ö~t™�šÓ�ñÈA 9­Æ3D ˜àŒG%¬åŒùï>Ç3O Ò'Z¢3O Ò'Z�g<ˆ@P×›ñx•Örƃü÷«7ãÑnø ƒ,ròs!OÂ6ÈSe+WAž.äIØy*håøåIv¥š9>yº�'!B5¨è�sË“üïJuÀ×”gsQž" ½�zZ¢ñ�zÐ(a4ÚS�’¸/²«òêMû�¨¯%:iìC¢¾VãIc?*!&8iìC¢¾VÛIc?*!êZµ&�™XÊœóÐ'a;ô)ÔÞòé3}î†>…†h²ú$ÀÎÈVZ>+è3}æ5•�¨øõ™GñÌËÏ5õ¹}e¬oN–‹é"6ijg+ˆt"]DâÔ 'ޤH‰@7°G“˜äé"DJ¨C¤ºôûs/*�û}EŒŸ¤i,!5€ñ#I£/ZÛH9 †�ÖÍ(R­cK,o<QBÜbX…‘¥ÔòÆ2 4a‡–ØòÆ2 4aM—7ˆÀ`‚ËËPa-—7È7Pª>û¨¥ô(ð³ÉI﨓0Á¥ôw NÂ6­†KéD ˜àRú;P'aÔ)T)Hª“üw«w J:`Ä»Pé»Z¢óÇïB¥ïj5ž?&=@]Klþø]¨”°–óÇä¿X½ùãæ‘æ9I~ý„–èÝ' QšNÐ}"*“!&8A÷ hôZ"²×Ê}½ˆñ£èí7Ïx¦id=§Œç{H€÷ðòjúêÜ ð^T²b” r¼²l¶®Ž+ÌÉï“Zõø“(ž J‹çæ@žvÊÌù<¯ª[+æÎ O¢|ãGQµW8'ÇIòSÈ¥O¡5(.F•séSÈ%Bumw.‘ûÞ"Æ�¢\ê¬<öæäùida2J¨IæÎ¨O#£÷#£ÄÎÉIe¹?PÄøQUœ*lå$ùäÒg/NŸA.}¦¶Åé3(NŸ‘-Ne¿U7�^í3þoÝgñÚš&Ð Ó7šèMø•Öèï¶Ñßmˆ~tûOÀ�ÔUäšôC¼ü•o3?’s­Å +=²h¸#'›6]o$ýöÈòüãq÷ñÓñKö£åÇO|{áñ‘“OS£ÁsöÈÝ‘i!7fܽù†12=›·‚86:~"uôD:s<5´3#A6Ý¥4ç@žüo#ÿgÿ¦�·õ”6»WÈhð€~• TÀ.­Ï.ë®ót9(aczÚÑmÇ×Í´åÓóA]YAqõo^¿~ùFѱ½°rwŠÆÙ§ýmôwWõuïݽ2t2úpÓOVpg?¬_U"/ÛA79 ãgÌfb&Ìù¿Þx¬ýŸÿwÿl…üêâºuóÎÔý”«1ü£_ü¡†•ÎìªçðEÃÆÃ…|n\Éâ�ê±(UøªòZ”׌•5×øŠÚÚ,Òƒxba½#V©ŽÐoeMÃ3#Ù§�Tž†¿FØ=°l}zENðˆ:p&�="Í›;ùÈý(ƒxhT É_H¥JÌ^½<}¡ ³õZ4p'l…Ý*Â¬ÂØ™.Ĭàv¯ÄînO*_ÈýNñ<ùB5õfàØB TÖë¦#k^¿ë€;a‹¥ˆTÆ�û] âQ”1cçÍÔcÝÊ膎+À¨Æñ�àÏ—.\¿£§ [Ÿ j%Ï7f³–7Ï;m¬mD–ŽÃW˜}¾ågË•«�È2 ØÉg¹?Å Áì«{V:•fÃg3ƒx$“¥�-ßýiwqPæ¾H.¬s×i…]¸ÚŠ3'ÒbÉ{Æ\9±Ä ûf­¤ç˜´X6GY\@<‚bÙ$K'¬¹Ä#®]­\´>� '±H¤äê#ä'ª_A¨ë¼­;³oJÖýyú_óÁ¸ß÷ôŒë,èT·ûa÷+«¾·=䉉àÿ.ýoÓàvxö …=žâjÉÖ•#¨í“Ò"á±BÊ#À3°ÏˆR_õËÀ›°oJWÜëm¡ÿ[ÀÛ°oKóhv\=hÑͧ–ÞOÍIª1Ò`ˆÍ°›•©¹5VóÅBOD€ß pöd2ŠÞ9YB\HÕD» 8{@‰ªñ/Q^¶‹–¹…ÜŸe�$�1ÔÖýÁ@ÙqÓ¦Ký×Tֱͭû·ܼ·Bë„c°ÇêÊòÍ… u@ìö(ì£Éç¹?Æ ž¤iij°1ŠwÒÖìŽWNb4³W”ïŽ4¯ tú|ÞŸ7mßJE³A†;Î yºmšéhò4øB4\³ì` f§ÌSôWžÉ›ÄÛ�Ë„Wa_•ÎéV9°Ïf—~©l>mꜼ˜¶¦ÜÓ’íΆ¼W±ïTq¨BT:€{aï¡T¡J(¿Õ"t•„Ë Xv�äH7°G[µ¥R2G6ç‚Æs)¨ËErå p¶Ðì,®èÀaØÃ5Ê•à(ìQuådÞñ*ÍÞ­™#'€°…æaøsäðl±yù9 œ„-Ô#-Ÿ#9ÇÊ‘KÀ«°…*yþ9| öK5Ê‘)à˰_V–#›Ò³Å‰~¾<¹ |ö«ÉäÉ+À×`¿&�'õƒºé§†y;Dâ>ð!ì‡Òdô+Á�7mú†•õtÏ4þ’‘˹Nε Ÿ»+}'B¶®L>[>j.§¢‚èK‡€#°Gª¯ úÒ>à(ìQù±oœ¾s„A<Õ mcÄ 5.”ÑwŽ2ˆGÑÛ7̆e|oÁk·h²£2©$ ÷u â,–+§„¹éÐ e3ƒj–YÚÎë^0Ž2\=ëÌшjX×§2:'7f•9œaZ§•œû‘¬Á6^9íÎeÞÚ+Þ=E¸ö>…å·BíEîÚ�½°{¥³iÓ`ØÈdK°¶º•‚ͽ®ixŽÝ+’3#Àã°�'“3À°OHçÌ.Ýð}ךÍí¾e§iJÅôxË6Q: ¼ûš|Ù¦­¦”Cz&è°d‚îJÞ5¹ûPÌF¹²]Ö릙E#›/—]­ðµK«i+@îë”kdéPlc�dªl¼f=æ®]˜Õtvk„DíR!0H¼ `@€`7°¶PõW¡žYcé¦a²@[€t+pì=¢¤WýòVàì�êW»í †}XZ±Çõ ÊÕ;»¬§hѧ/RÈqË_Ö—,Þ >4R~>œ"vM?ïÚ–=Ç[Úˆó À·`¿%ÍýRÉÆ¨h¥)èvÝ ø´™1è4”E¡šŠÛ5�œi{%û©xßd7 (á%Ø—¼‰�ÖÓ–^^�º—O¥LÏ‹ò‡ZÄE+dƒ>k¤›vÚÓ¬¹yæ yߤì;”¾ÉnCÏ/ÓZ2C‚¡ª¸[K&à›æI·ZL@…�§¶6 yÚ´êq™A<Šª¨­3iÓK¹V®¸ `UÛJ Õ%“hô�•'<ä†(Õ1(× Ùò¬t*vá©)md�¢‘Åu+£÷»æ“¼åš7ŒÓË)³¿wúÎmºpµwP>1ý bŸÔïNß»<0Vùçó>MÀÙ~ÿ»zŸn>5¨†ñ¦2¼ïÖƒ÷!¼û¾2n™I;¶ïÍǤV¹^|öëÕ«=ÖL‚7Ä#Éã•>=ÊÁ¨Ù¦µfjÔr†?OÛ+h€Kçãf ÏÖû_2]sPï�X0wy¢W·èË^ÎLYF–û�t¤&á+°_‘~£‹}`O›ú‚ïÑØ�6ˆXöPD»øBÌôz:œ“­8T¬ø&̱;í"ì‹ò-y_P†²Y¥NÈ›…9îþ, hI{P�—QuZº þì¸~49Ï¿7·ô Õ5åƒ%;‡QiLLDØ?ÀjŠŸ2�ªÜ!0ÉŠ¯ù½©ª‹Î6;aw&Su1gvË…L¬ê"ÿ{Ä£, âÌ©Ð(ÒkÐTvº¸û 侎A¹¾B«,�ƒZ´ë,F<’©²§p�o´¶%l.\ÖZ”SîZóÍr»“iþ¢ X& �¹ŒUnë�eÂÐTkΠÙ@÷ÆUlIâ•3k¤`KR]¥Zѹ¢�°L”·j‰bB lÓVEyÍîØD!�x6«L”·j©sŠ$df#W'ùï–‰ò¦H� éÙKAŸõîrŽ3a8Û×lÓVÝ¿P-y†$keï_HNž‡!ËÃZÙûª%ÏÃ�äa­ìý ‰Éó0dIX&B¨"ynä)rRé’p'l¡³¸|â|‚$Ü[ìì­¤8‰@›VœÞn-%|â|‚|AS9?Ê/Nòß,4]]Ë~Õô§ìŒÃIoŠÔmÙ¡ÈA­Æ-û T9¨%Ú²3#úš¶ìƒP%aõZö­tQï´i¤oÚÙeN†Cå�Vö‚ºj t¢ÒÊ^P—œ@‡�+C²9Ä'Ð!ˆ’°LÐÁÄJþ»€ÝÚª¨ êªO¡›¤ÃMÀ«Ïa(’°¦Õ'h&X}C‘„µ¬>É'°zÕgKzöšåùź¼s:#PæˆV6üuµT:evk«Â_'§R"ÐÔµUᯫ¥Ò(“�YL‘|îyQrßË Eo¿Fháp&–^zX£yêѨl�`)-wòÅÔ0'?Úðß,ZX:ƒ*FÙ =®ªkå¹3ˆÜw1ˆG,V}kÍ(›…£šˆ6éë(›5‰Á¸f¬ÍÃ+Äôÿ³±6­¿»÷g/¬¡p¬M§úù\¼àèÿl3V;ŠÂ+ëbuëè³Ûd³‚¿HÔ�tÜd¢—$.móƒ+ŽÅqп’ëÂmâÈÖñÙ©UèO>C¸Í2Q“Êr¿‹ÁQk™1l¼Í�°…R¨¬×g‹·#K©œ!÷m âQ”3­a¾ètÖ'¼HÃ3y—‘Ùxš°;fϳÄÓ,³P•Tö�û= âÌžºg¥#OS0Yv—àþ@, j–YÁ‘V‹`@ͤÔò59Õ²I–N8�ÏàŠ€šüâ-ÁÊ5yGÏPóÙ‰…„Ö¯ ÔY ¨‰XšŽM6𿨄pe¢iŠÜ1ZEIø ìW”µ�ަ‘ަ9<û”(õU¿|x ö5¡ +)xÃ/x�A<Êòæ#â÷ÅV×i%V“ªãP¦1âIš,�1/ ÝÛE˳f³Ëƒa�â ß :À¾aÙA½Oý^‘Ðh/ïÁ¾§,뚢KwoçMw™¿pmG�"¬ÆDÞ�ÇÖÕMäño_ ïì¶ÁV7_Ô²â>dþìiA––Ù`]­ìiA–JMs÷l-š×€3°g’îöÉä¨O§`O)ï1àØ’ï0ð!ì‡ò=îƒü?ÒŠqÌi%qÌ’ê°AÈÔuL´µYÈÓ¦þñ(ÏGE¥ŠG¢ñ ¹P¢Ñ7ÔG¥"Ju Êõðâ¾âʱý.Ñ,•k™A·WÏdã $ÏL–€„³3 ZÉnsÎ)ù•w� EhëcOÒE’Ù^\˱B\w)¥ñbÔ£E Å9kÑŒ‚(RŠBµhº‹–¹aø)’/õnÐ%|ö‹ÒÔ¯P¯›(™OÍT> ™ÑŸ=B+x‰0ÞT4g«ûÆlžâw‡%Äð"̸6�»�èÂ+°…j:95èp£5 _w<ŸRÑ'UPV©K[ðƒ¤Ì™áØ ãú'gæ$ {Jqïpszö‚e§¹;…ÄêðØ í$¨ŸŒ8 0><û¼’¾à>TÂk°…6ðõÉÝð:l¡ ÒbpxömåRmв}í©Ãµ(f�Oa?MF¯['â´-Ø–2ÑÞ.Ã^NF´ÓÀw`¿#?€ážJ%ÿï?ûÒe¹xöÉê$r_ 2{\ZÀ]ƒúÒ¼•š×½y'Ÿ lê^>“±R–@`m¢6|ö«ò}ð¼�5=O_vòú’aû´CÉ#„‡ÝÛhÜ£32 vŽæÇ�e^êlTNu}ð‰ i%ÚóÆ¢²£NµôÀß XRW|9ꈳ¯æšy�ÿŽ 6xæì iþ'îÆÝ8¬kœÖ†CÁ 1!èM/Dd-o^¨ŒÃ]ž€-TÃTë"v øì7ùªÜAd/¯ÃÞ_ºê—Ïß„ýfõk@rw8[h^Zr.”ü?>„-?'»åŽÔYÏá-=Qb·ÀÞ"UzØoí^´ælÓ÷ÍþÞô¬5d¤é*çto¥"Tq)ÿ ¾Hß ¨r9¬‚hÈ]¼á»¶Ð¢SIªìŒÖ4ƒJ;ûØŸw�üÜ<·ŒˆÑð4ìÓÂùvBvÊ„òd+ƒrç@´ŠùTa/°µÌ]@‚ù´Q¿çq_KÔÏ`ì©¥|m™¨�-´çYlt+º¶LtãÕß^mÕÕvMýb p öXõkr×< û¨´jû©˜ /(ÙæXr2zx¢F$ñ1à›°…ÚíŠ×Ä R¢Šo›VŒ¼MÜ­XÖëÖPÌwŽ1g�VyÇ–v«@â½ ò¿[+Æ^ëµÚõ/óU]ýÛ¯ß W%é­A}Ö²ãaOa(äE»™8ë0ƒC°Õï¤�+'V�/Ã~9™ÚYp®œ˜NÏÁ>§¤b¦_<|¶Êuƒ5B¯Á–?ã'2WN ®oÁ¾U�Þ„ø\9Q{ \‚½”\oBt®œè>ÎÞW&Ú×€Oa«\åç]3Ú%e2“¼¥ž¨^Ú°miÊ…«�A›ê©è–ç°žâ®›†£2¢[O®n�KÂÏšŽ0X½YÓ-éÙ+¦Ÿšç®ŠˆV¼�jö@2UÑæI� Ü®Ãlã6zµýb ð0l¡³æ|µ¹k¾ûiµŽQ-4gúÑfWÛ§ËG‹ÕÎ vP…„­Ü{‡ˆï ðl¡³¥»Ò±?×5‚!UDÁ˜ÇíhTJBT7y+,‘zÇt��Yx}.­Oæ�â ˜Õ¬ý�àMoÁ¾%ßé2hûvq3wb��ʘVrš\’VñÜdʰií"È AêY9JiKd3öQ0$dÖ×$Ù^¤Ë^hýsÉpÓT¶H%Ä?Ÿ£«|Íô`¸Ÿ….g×1ŒT „œ´µNÞ Ë"÷ˆþÈ–¹±XðEú¬L SÛX´æhÍ…*ôrü)Îlb·%Õ8—„5îg°zÝ�íéÙ— ï"ÎcðÏÔGÉ <;¡½�Í“¥Ü˜·ÀŠ:Xö—[€'a'°¿‘Ü5ÇaËÏÚí ï…7³Y}iÞ´©¸¢kÉ›¿î'bÀ»°ïJÜÖýQÄ5Ñ JÌž9ɰ3Ê‚(•=ÀnØÂ}×g¹Ûì�Ý£`œ´¶]iv…ŒÀ0 +kP?ˆöeÐ_â–QÕ�×`‹­T 5'¡BuMÆa}:<ö³†çi”wÃ.ŽGsè¶Iûw w™;¹N28¢úçI%³žPëvœÁêµ°Ïæn-’‡€/ÂÚWÍßÀn›|¦ˆóko_IûJ¿ØdÚÚjW�L›Ö5�šè&köÓýa?He[ÏçVŒù°]‰»ˆÓÀ7a‹mSb?¯œ&¼Ú¨ßê=Ü«?kVéfš—>³ý^áòãÑ � Xélºn`ϵ¨“Jå]ZHMç]„ùá@Ë¡ªU¤%bâè°CGÙØ”O >çý›œKGRáÌ�À’Çi�"Ü[<Î~Å)FÇ6ŸZüuÑNÀ:ƒÁ_×mžiÊýÀØB­iÙ_îž‚-¾ûÙk9r·ÈØ’Yg&ï“Às°Ï)ë6ZÏp'&ÒfÆt…ûpö\2ŠmŒˆ‡¼X_¾û5e¢½ œ‡-¼£ˆO´ç�lKZ´Ü'ÈýÛ â‘<u½i{4+žuóÙfØÈ.ËBT˜ü[&£""³N¯(ÃfL;¿^QWÆ÷!ø;Ä“t®‘û:ñ(Jº4U!®PÜŸ­mœÅKÇ(œr4Î!bO�µBuR(£”³@ýW&²‹@4#ªd€}°…¦ªCžm²ÉG42ˆ'é\¼€œ‹±Fšf9ÒH$šÑ%Ð%Tw’úTÙhFwn_ š„ DP£püæYéà«™ …å}&ªdhQöÓñöQ/ušéhœŒÛè-ËöL7¼(xÉ´dÙ´LɽT}„ åŽR³Ÿ¾ð ôZáv¾àï˜àN¸›�Åì*H2w% W7RÓKàI8 {Xy×^jK?Q›Þƒ-œŸ¿g/³¥ÿ%”¹— áSšD ÄU¿ü"ðUدV¿kOîF€¯Á«H†¿!ÿ÷�¯Ã~]š‡|ø›)ÂVØ­Ê‹Rczör4Äà.HDìà‹°šÀ¦Ð -@ºØ[8Òòª_î‡�Àä5¹Û<[¾YSü†¨�Þ…-¿<ÜCýÛ±‡VÇŽ±v½Œ"ö²VªQ¶o“L˜˜W@øí9 CÄn?6ab˜`ŽŠÃÄ0N&&æ>ÂZ†‰!ÿ€µš‡‰¹†C¸ö©ÒÃ~KY˜˜kø"a‚abÈ]ðù CŒ€òabdg&¨ŠØÊ`Âabn@¹„5ÞqƒÁêí¿�¾Íá4C8{<™FIö6¢Ü<[hN°ì/·'`«\ª­PË�»Fà)ØòSKÕ C,OS°SÊZ áp17µ(D a›–t¸˜›Ñ«„XËp1ä7°C“ Ã~Ú{…fúœ³(žÝ O—ëœG1‡î2Ø[hè½f¿bGxéÇ´³ä�wðœë%‚'€S°ê ·N®¢/@¾x ö1%}Œ»(x„/ÃN cLîÚ�¯À–ïï^ÂÎ/Ìš.oQ'V×€)ØbÓ\ì§=o$<* Ђg¡ÓÁ]Ý‹ÊIˆ=°{’«�^…KBuõÑÀªS¢þ’£â�è« ÃN.µ^C ½¦4µ„)^cð¹=$Jä?V‡D‰p;Pí!QúÅàq-±C¢ä®ø|%†'�ÃC¢÷£R¢ºñb‡D_YÂçò�è Eø%ZcÀ�É!Q¢ÚÑT¥_ì&xH”ÜíÕŠGkwH”LÏiÏç!Ñ7˜çãsH”X^ª=$J¿x˜à!Qrwhi5;$JîßfðcpHôͨH„˜ô!Ñëð7¬Ñy2r_Ç EI°Ö!ÑóxéµM€xé…@ŽÆC¤@Œâ©±Ö!Ѧ+†•¥²´T%'ÅGZ4R$lƒ-4ÇRk’M1¢ÑÁ ž¤3î-dVŒ5’±׆RÎÛºáûæBÎ�FjNÐí¦ üY×4ÒËÑ_¤ÙA›åyùððè’áRèZÞ÷˜w °/È÷À2ü=°¼n€½AªVRŸå’¿Š›“ˆS#°¶Ð^3¾ž¹ÛÜ {·tæðŸY#ÿÀNØ�ʲæ™7ÖVÌžtðÔÛa'�=i¨4�ìYW£ìI#KÒÒÙSâ�p21‘ „êËp+S†×ÞëRQ)D¬¸¶ÊõÖ J!w�]°å×[ù•Bþ»�=°{’o<3�FŒÂ�'w'ø¼ÍÉz–Kr_Ç`�:ÁóH�«Ô ¾“3SVÆJÅLyfŠ4ÀnÊw‚·É¦Ñè`°F�à·‘Y1ÖHÆ�áú±4 ‰µ¬Šu}V‹z„»`ïª~]ŸEBd¡Øu¢Š-IŒQ=ãšÔÑÏf©ûïäÝýÉóœ”Ñ/o-ޥÛ•ĶxöiÖ/0KLN&¥Dý‚ÁA>—¦³NŽæk‚j�{.iIK¨.\ÉŠêtéÂT¼])¼Â|š£Ó;F¨„ÆeœTmÐ#<[(B|UŠ ±NÀNà¹;<[þVCxÎÓ4Ró¼z"§�—a_–ʤ²]Ø@[2Î;ZÔm#�=¢0»Öº(�È‹ß9OŒ›€{` ­–ýåzà(ìÑêK؉28Ä#°�È�»V¯ˆÁðEØb¡¾Öo#^ñc°Äñ5`v6ï( Xô$,±¾¼ [(¸HÙ_> \€½�Œˆ�mض´ˆëö’»Qw˜'_Ĥûµ¹HüLn|jÁÛYÏr @îë¬ÑøÔE Ä(7¾Øú¬t*v•<-š1Š�¢ŽÜu+£÷ãxÌ cÁôrFÊìï�¾sûšå›½ƒAçÙ2ýì2Ø „}þóyßɹVP¿«÷]Uƒ¢€ySÞwóñ>„÷aßW¦ù-3iÇö½ùø˜×*×뀯Ã~½zj[3 Þ`�ìÈ-åØúé!½Í9:1aÿÀ Þ;±`.8îòDï7í<’Œpöh ’o¾cTSwõ¹^”zÅ.s� AŠÝ¹|íòÅ»ú�[;B¹ËáØOwDÅ0¾Õõø™=BÔ„‰çå2|Ǩ&/[K‡ªA q{d[a·ª vÉò�ôÅOì]�yWšXÙAþ{Rµû'´¨F'ì„-´DÄ_»‰A(· TNÒä/ƒx”%Aœ9ú ôÚï)-MÜÝ)r_Ç x¯Ž$ú’,�OjÑt~Œx$SeÏMÞtõBL}δM×Jy:/ÁO!«>%­Ü5�l¨1¡nž™ä§µh&åÓš‚Y•5‡Ó«ÜÖ÷ÂN`!õÓÈÂ.صXH%ÿÝÀMf!+ge¥±I(œÇg ÂVØB-Ÿ">î€-ßu©ãŸÐ&;�»`'°îóÈ‘Pݺ¿4É;p7l±])kIs+ g²ù{ÊÎ8œ ? Q~ ›Dò ô³%aìŽZ”t÷ÀVYeWèg!J½°…ªlI�’ÿ.`7ìnå­Ç8Œ“ÜOA�„Ø6+V‹ñió§ GÂ�°ÅâRHj“ì¶ÁªÅø´ùSÐ#¡Â`~ÜÚ$ÿ»�šL0¿µ´¹% L Ps~Šür¦ISÛ´UPçç ÈÏAõ¢¢�Uçç �Ïi’mŸ:?E~ªX'¬ 9u’ÿN Tñ¦:›â°�<÷úØç¡ÊÏ#©šD“ŠO¡Ÿ‡*?�T©×Tl�Pèç‘5„ÕèSA¡Ÿ‡* k9."ÿÝÀ­Zã¢ÙÀ.? eþ4’«I4¹øTúÓPæO#eê5Ñž�¤JÙC¨ÃÖ«¯ÒŸ†2 ÷ÁÞW•’ÿ^`l±ùÿµTº-T©èFƒŸ�, ;a«›±­(ÑŸ�, ÷À–Ÿ­�(Ø ì‚­²ˆV�èÏ@–„ݰQn‰’ÿ ®I”Ð�’èK†w÷òÖ¢_€,¿�¬D¿Y~¡Öýdù…d%úÈò 5–è Ë/TU¢[Ó³SÞ´i¤oÚÙeN†? Q&8Ñô³%aM'šˆ@'0Á‰¦Ÿ…(V«íDùïVo¢i ôU#kñVŸ_„" ÌŠ$¬é`ž´ÌŠ$¬å`žüw«7˜ZøÛyÇ7i£‘kd99¾Y¾¯%Ú¿Y¾¯Õ¸…'{� ¶ðïC–„µláÉPתÕÂ7A¢w| ‹ÆIñKP%a‚óM_‚*¿¤Õx¾éK("_Ò�oúTù%Må|÷’/¡€ÄØ­¤ pÓø9¤@Œjö÷è+v²„GÞ%¶³ü<˜ê°uáÒ\i;ËÎR¾B{Z~A‹ ò/€i“(S¾BMîê�û` MOñ•¥_@^öÂî­AmOþû€ûa ÅP­Âž–_„ [µÄö´ü"T@XÓ=-D`'0Á=-¿9¶ÁV0Và–&ùoVuOK¸e@ä:š/C”_Ö�jø2DIXÓ©"Ð LpªáË%a-§È°zS -¬@/ÎçcI<3Í_‚2IKtÝë— Ì_Òj¼îEz€º–غ×/A™„µ\÷"ÿ½Àª®{I,*|²$LpÊá+�%aM§ˆÀ^`‚S_�, k9å@þ{€ºV­)á9Û¯B‘„ ÎÙ~Š$¬éœ-h&8gûU(’PÝœ-÷8ŸÜw2ˆ'i¿ŒˆQét]ØÇ2²Ó ¿f„:lý9N~M‹Š.a‚ÃIrW¬ép’ì&8œüd@XËá$ùoVo8)¸ýèñ-Ñè@�h5Þ�þ4ù�–èô Ç´Úî@ÿš$ìЪµ]fªãCˆòC-Ñ©Ž!ʵOu�N`‚SB”„µœê ÿ]ÀçxªãëPæ×µD§:¾e~]«ñTèêZbS_‡2 k9ÕAþ{�Õ›êh·øŠÃûUH’° ¶ÊV®‚<’$”Š”.+O"°(ÕÌñÉóW!IÂNØ Öí¹åIþ÷¥–í×”gsQž" ý7 Ëoh‰†øtù M2´€¬F‰@Pª¥ãÓè7 KÂØ=5Ð(ù×�û`‹UåÕ›-þ&dI˜àlñ7!Ëoj5ž-þ&ÊÈ7µDg‹¿ Y~S«ílñ7QD¾©Us¶¸Q<æí¯A“„í°UÞLRAŸ¿Màf~}�`§&q5 Ÿ> š$TsŠ_Ÿä/Pªx®©Ïí+ïEádù-ó[`ؤ©ÝCXA¤ß‚0¿…Ä©NI‘�n`�&qh•O¤ß‚0 uغôûs¯&�û} âIšÆ¯#bT³¨Ñ-j¤œºB7WZŽ-±®ñm�#” ©~]ã;ZTz [µÄÖ5È]=°¦ëD`'0Áu�ï@„µ\× ÿíÀê­klIÏ^Žn€å¤÷](ò»Z¢‹çß…"¿«Õxñü»È’ïÊfŸ:¿ EvÀšj‘T'ùïVïÀ“tlˆß€2 œ8þ (“°¦ÇD ¨k‰Mÿ”IXˉcòß ¬ÞÄq³Ü-¿ ]þ¦–èÌÜoB—„5�™#]Àgæ~ºüMMåÌwW™Üë âQôöt=…id=§ŒçOâ¥KSÙIçN€ßŠJVñ–Ñ•e³uuì`N~¿­EÑŒ ÷ÀVW<7ò´SfίàyPÝ"1w‘û.ñ(Ê ö Gâ8IþræwP„£Ê¹ô;ÈBumw.‘û^ñ(Ê¥ÎʃnNž¿‹Ì!ìƒ-Ô$sgÔï"s÷Ã;'•QäþƒxT§ [>9Iþræ÷/N¿‡œù½Ú§ßCŠQ¸8•ýVÝtºŒÏø¿ïáµ5M A¦o4Ñ7šð+­Ñßm£¿ÛýèöŸ€)¨«È5é‡xù+߯ɹÖbЕY4Ü‘Œ“M›®7’~{dyþñ¸ûøéø‰%ûÑòã'¾½ðøÈɧ‹©Ñà¿9{äîÈ´¿�3îÞ|ÙžÍ[Á??‘:z"�9ž Ú™‘  )¹¶d8Έ<ÑØF4ÎþM!#ŠëwDú+QÓàý*•«ð®ÖÙeÝuž.mlBO;ºíøº™¶|ú`Þ¨8ëWñæõë—o”ÓÓ /ðÆ:ˆsQûÛèï6®êòÞ»{eèdôᦟ¬àÎ~X¿ª`^¶ƒÞr¸!ΟÍÄ,L˜ó½Ñú»{ÿdý ÖÅ/tëæ�©û)?eøG¿øC +�ÙÕÏèBPóB>7®dñFõX” }U±­ŠmÆÊšk|Eq¥FBbO,¬OŠÕ­#ô[A‰òÌHöi'•§Qpx°nÙúôŠœà/uàL8{Dš7wò‘ûQñÐÂÿêåé e˜­×¢ñ;a+ìVf†Ð¶±Pn½yAˆWb— ’Êr¿“A<ÏA¾PM½¸¶P•õºiÆÈZ†WÁï:àNØb)"•1ä~ƒxeL7eˆ»Õ3Ƭ“÷ãÛÉýåœÉÛã݈ì!<û€Â¬ò-?[® mDö„}0ù¬"÷‡Ä#˜UuÏJ§â¤à&dAŒx$“¥�-Ëý�Zõááaþûáê‘QØq«­8_"-–¼gÌ•K܈oÖJz‰I‹es”ÅÄ#(–M²tÂZšA<âÚÕÊU7ë]î:¥i¹úù‰…„Ö¯œ“9oëÎìÛfÊzYóÁ(ß:îzÆutž[�` Õ}å7…†7�¦ù¸�¾û…]›5nß>)w›Qž‚}J”úª_>¼ûš|=0,ð‚×Ä£,o,ß\¨àvðìÉׂäþ&ƒx’¦ÑˆˆQ¼MX³ö ÚINbT‹ÔkŪY®ö[Iè@´ÌpçÂѦ§ç‚j¦õ /è;ú‚éÏ;iO„rüŒ±Ú‚ÞŠl#<ûHòJ"÷c âQôö 3…¼ªÐ†Ókdz–5êÙ4¡Ä(׳钥Cón›ïW8­Áô†x;ÁÍZT¦ Ë2—.,Ö훡Â]°Å•RYCîÛÄ#Ic—kúy×öt#ŠÝ‘q�“—Úv¤Êv¥)Ô¹dùóºáë4׌±—=ªÇÓ9ùµ€a™s{’ªÞÔK³U½¼j&2û€a �ÃùÔLîöÁw—¸Ói­V [ú�ƒ°f ÍÊeËQàIØ'“É–!à8ìqéliÑû­ {2"ÇM›nʼn‡µ²hø2ì—¥i ÷“ZœM¤ÙB©yz¾áúzTôõ´ã órn�Äâ0ìaiÎîΛ¼g¦¨ÙÒÚÖ;ôS�Àí°·W_àän#°vKmê�al±–Ta½¯ŒöÂîM&[Ú�}°û¤³å@¡L§Û7Â:ÈÔI®^˜aá|9o¹&Šû�/Á~Išê¸“ ÉM(ã/ŠÝ¡¨b²<=ê+c>‘9/fY$¬á×i¢5|¬ºÊs_R±‹½Ç;À·`¿¥P„kÌ}5q±˜WÄö ðì[¢¬Wýò9 Û¨~¡$wÀYسÒJ¯ãnIÉ ˜†�®IKÊŒ*ªÒ’ UÙD¦¸]K¬%%w�êZÒ¨ÿ¨ž£0H‘Lj_Y&mIÍ®‘òMW$Ÿ^…}4™|:<û˜t>í PÇÎ.ëÇÕ­â’4wñ&b/o¾)M°íR´%-å,äò¾Î�òø¶H…™Ž‡"kSà‰H0Á>¹kªë£íB� 4äù¦‘ÖóžP6íž„-4Z.›M;â~L¸pnë“ú(÷¤!1; ¼ ûv2y6œ†=-�gÜ“†äþƒx$iLùŽ|l¥ÛÐß1]gˆR0f˶|ËÈZï}åp(O5@Êq]Z;¿ޏk,fëƒ6{JYfnšY4²ùr¹¹ ¾vk´X@îëÄ#XÚ6ËÒé@ÊĈG2U^¹å:é|ÊŒ§¤‡™1XÚôR®5kz¡ œ¼´0Ô[1ô'¾dX¿‹�Û°Ð<637.ý¯Ó—þK_È›wòÙ´>o,åÅÓ ›vp/yôZS þÖ-¼MÆ2³iOÇ�ûË<Ó¤vŸ÷…˜è5 _è’i¤æ ÝE»0ZFN3ɰƒWÌQ™Ç˜ºø:¼oÂGÓ.Á¾$ý&=ajëýÐüÄ`X3 êA³Sy›V%’] FØ»'ùj¢®cTS[ik³�§M)v™A<Š*÷­3‘.ÃIç •%”.“hô�•gaä†(Õ1(WíÓ¿.{�+®;™Ã\™,w8(ZÆjЊ1ÿVäâÜ„±[6íˆFƒx’.’½ÐCŒ5ê@0‡Òxñî¼å•z*:¦i-†mw AugÑt-s)4Âf€dÅK�9@T×E(Iý �¡‰Rñ˜iÐTQgÂ2± Múê¾1›Ï¸á"h¸‹½]þnìð'¼ûJòj8×1ªQÃðuÇCƒ¨‚²:hMŸÒáË )sfx„-ed³´w4ø'çCàI(·¸·Ö,úæ(~÷ü9±º|vB{Gë'…b~ÓSÀó°Ï‹2^õË/¯ÁÚ2Ê7ð&w#Àë°…¶ˆ–ÎYëA=!�´7€·a Í<¬)Õ¦(ÛÃXBzÍŸÂ~šŒ^·N2Äh?Z°-e¢½\†½œŒh§�ïÀ~GZ´üá‹Èÿ»ÀOÀþ„4�Ö °¨3@{1£Ìœ¼ú#á‡ØªºÖŠ‹ÒÖbÀsî’„½K!ž€}"™’Ô8)|�±íÀPR�è;€'a'°�ŠÜíŽÃ—p× ¾4o¥æuÌäÌšº—Ïd¬”š·Œµ à«°_•ïƒçí¬éyú²“×— Û§=éF*EUœx §• =gÌѼ¬±ÌK}E�P]|"hZ‰v4?°£NµôÀiö8œ×‹:â쫹fÞ3¹û݇Áù0’}]„’üOÜ�;º­'yËÅÌW0Z¤YoÛÆÈÈô‚ADÖòæ…êÀ@˜ðl¡fÍ:°‘¶h‡Œ¹«@"v øì7’©& ´H_^‡-|¢hÕ/Ÿ¾ ûÍê×€äî$pöŒ|W‚»¬‘ÿÀ‡°JóØrÇ êˆ¬çð–&¬I4XÖÏ•-5»­9Ûô}³¿7=k éEÃN™éÞJE¨âjå ¾Hx¶Ðîl>ÑćãLC„’™µ3Ü¡`•vö±?ï:ù¹yn£àiا…óí„ì” mËÞÊ ÜÉ_­b>U8·ÅÌx°çø%ói£~�å˜ÁØ ÕÝ.'àn�ˆÚàØG’ÝŠÞúAtÛ�½°{•4Iô‹-À1ØcÕ¯]È]#ð(l¡ýW%Iܯ³»Š+‹ñu'£‡g¨y‹8±<|¶P»]~›è±ô-Z`'lƒÝ¦,ﶆb¾sŒ9u¾Êû: Tü É^ùß ìÐV]üVíúw¯N¨®þí×oâ(LvyPŸµìxØS yÑ.ÎÄepH+4`Š«hѹrbuø2l¡£Eüµ³à\91�žƒ}NIÅL¿x ø l•ë*fr7 ¼[>ªƒÈ\91¸¼ûV5zâsåDí1p öRr½ ѹr¢û8{^™h_>…­rñ` ÑÞ.Ã^®ASDþß¾ û]iãádRxÖ(œJÂVo+Ú?5 8Så鹬‘2磒¼ô�Då#ÄqØò3¥›½|jž–Ç9ÙŒ�akJ]Ü�ug+Ñ©F�h43ˆG™´Mw¶‚Û-Àí°·×¤>fFáéŸMe„úýG2d°Ì�·ÕÌ�]À.Ø]Òr`PO›¹`tn�(¥�¦³FêqðwuD»�`_H®g|4ÊæÕõŒ[JzÆçŽ2Ø[hÔ´ö¡ËgŠk²Ç1àYØg“éX4M>K¬Ñ5x÷G`�(éYEq#<û\õ{ä®x¶Ð^˜’4ŠÖ«Â-•fXÖ=ßͧü<íù–ÝMT/mض4åp´…7 iS=eŒ�l´Ï›—屨̄¨ÃÖ“«›˜¥ÊZÏš¾È`õfM·ˆžÿ&Zû€°’©Š6OŠþ~•°v·’Zˆ~±xöáê×B䮸ì¤Õ:FµÐœéG›]m?Z”. wP…„­Ü{‡ˆï ðìÒ¼Û±?×5‚!UDtr†»:•’ÕÍ_Þ K¤è\t¦'º…ë“9Çó¬Ù¬YÍÚŸÙΚ¬ÓDgMØO[ŒÒh`܉}TNj%¡·$iõG»Ì}3§§ ›öàÐ.â`€¼¤ž•£”¶D6c3ƒ_vŸ™$Û‹7qB{ÉpÓT¶H%Ä?ŸË9®o¦Ãý,¶¼­c©@ 97hk�¼–Eî=³£%œL]¡ä‹ôY™¦¶±hÍÑš TèåøSüÈ2'’꜆KÂwN3X½îÀöôìK†wç1øgêO£džÐ {“è4O–r`Þ<[8Æþª_nÆõ\ûÉ]#p¶ü¬Ý*ؾ™ÍêKó¦MÅýPÐ<¥›¿î'bÀ»°ïJÜÖýQŒ]=ŽXÉÉl2*!î„­nJkÃÝé{—+åf¥Ý>De°¶pßõÙEDîv{`÷(ç-…íè u-ÃãÍt²yѰ²õƒh/Pý%nYUx ¶ØJ•P“qz!T×dÖ§ÃQa/0K1N3NÞ »8áÙpÛ¤ý»†»Ì�\gÑ KçI%×Y$ÑY¥É%Ôže°z-lsÉoÜ ,‘;Œ�L í«æo`·M–P ÞÜ[(âSÙ_n‡}¼úU#¹kž€-¶ÉšýtØÅRÙÖó¹c>lWâ.âÄð$ðMØbÛ”ØOÇ‹ƒ,+ŒT wY¯6ê÷°j÷êÏšÁ_†UºÉ™â\TŠBdF`’ô�RD¬ í¾7]7°çƒZÔI¥ò.-¤¦ó. Âüp åPÕ*Ò�YBfÑC¶6˜œs‚þMŽ¢œY©pæ@`ÉãH2ñ?×x[{Ø|jñ×uDk 8[è ]·y¤(÷G` µ¦e¹x ¶ð…-Ï^Ë‘»½ÀÓ°Å6U—$ŸÀ:31˜žƒ}N¹X·Ñz†;1‘63¦+¤Ø7€s°ç’QlcD<ä-Àú:ð5د)íUà@îßf�ìà)¨ëMÛ£Yáð¬›Ï6ÃFvÉXö¢ÂäßÀL²·±*ʰ†ÓÎ/„w—ñû‹c6áI:×È}ƒx%Áæ?)ãy^úrmà2^:Fá�£q)£xj¬ʨéŠae©,-U‰ÇI‘ª³`ì6ŠqÈ{¹# âI:ã^BfÅX#OÁõ”R—ÏÛºáûæB.<\ﲌÂÁGgØRY‡.ûbÆm®ayÑIßp¬Á]+¿ ú/kÅÊA(Ü™\Š2aåR”»f¼ o×j+)r_Ç`�jÆëH�«T3ÞÉ™)+c¥Œb¦<3ÅZñ Dùšq§lŠ�kT3ÞDfÅX#ß‚ë[µ¥q®o+¥Ñ|>7J1:¹/|™ÂfØÍR£Lö[[\géQx·I¥!M¥õŸi­ ºvë?Óø"aìé<꣡ŠïFÞ²ÖcS§8·Nxif”yÜM$Ô�`_H^Ów ™ÕhúÐÝ0&vAÕX/‹Æz)Çö¬`üÇ^æ.2Áò$Év¢xÇB£‹pøÃ˜Ü'Bõwñ}äÎÇŠe‘øìhê·>V(‹änð0l¡M†’§™Èÿ ÀAØbwñIµW¡ˆÕµƒSìñ©xÿ@ÞŽtô¹7<¾~„a”æÚj;ö�D–Ë>èOœ¼îƒ a+ìVe%¬îÆyÞ¢ED:€�°…Š<_Ñ"w;€{`‹-„°Ÿîb+kÏ£¸/ü3rDi/pöhò¥íu¨#F5¥íÊE¶Q §3뼜c‡[ïܾFKÓúcsyÉqÓQbfÍŒ”ÉÔ¼aÏ $éàOÈÌ2%�¤oÂuŒÉ §oÀÛŒÒÌäNr_Ç`�†Ó�1Ê §›ž•NÅ:ð¡m&ˆ�¢Jùº•Ñûqbø»œ‘2û{§ƒ’fùfï`ÐòY¦Ÿ]Ö'uÚ§60žð9Ÿ÷�œkÙ~ÿ»zŸn>5h“¥7•á}·GxÂû°ï+Óü–™´cûÞ||ò}•ëu@¦6«–ÚÖL‚7Ä#Éc4觇ôbL>äèÄD„ýƒzïÄ‚¹à¸Ë½﫨Hû-$á(ìÑ$Ÿß1ª©»F]/J½b© Aƒ»sùÚå‹wõ#úù;º1¨�Î $ß,¨Î*M¾–’Ó¤®ÇÏ+.„-°[¤ym-ÜÆ%@) „[a‹N“Sš ß1ªQZkéþ?‘Ê€ ¡\¯}±K–‡¤¤~~bs 3'M¬ìÎÉ÷¤ÚÚ€Ðì„­nl±fÛ3�Ä ”Ûh%'iò¿—A<Ê’ Μ ½zmKiiâîì‘û:Åûœ;¢´“£C[BÄ#™*{n†S©…øqúœi›®•ò&t^‚�‘U�¥•»æ¦èÕ!&¬Ü3“¤»š€{` ‘¬0kPÜvµÊm=p/l•‘F*LVd‘ „]°»¤5ÃùïöÀî–F]ilŠ¿¶¶Âj‰ø±C>kø§¨‰ÀNà.Ø»ª/ÍÈ‘° ¶Ð²¯¤4É;p7ìÝÊ¥Ù$s†* ;`wT_¡6TIØ [lMER¡D`°aš*(Ô†* kYy’ÿn`õ*Ïz±@ôHˆ9-±jŒO›ôH¸¶Ø±KIm�]À6ØBÕŸ6è‘Paä\nm’ÿÝÀM6rn%mn ¯¢&•ƒ"sÈ™&MmÛVA�9(2QÔ‹ŠBV�9È#§I6n|êÌA‘9­xª˜*äÔIþ;�{`‹�HÖhÛuN;K�¼ÍÛ¶?�*Ÿh‰¶íO Ê'Z�Ûö'ÈÂÛö'P%a-Ûvòß ¬^ÛÞ+Ô;ŸÉ˜)þˆ.”é"¹šD“‹O¥.”é"eê5Á�l²*u‘=„:l½ú*u¡LÂ}°÷Õ@¥ä¿Ø[<´N%•n UzÇ7üðJ?NŽdIØ [åv� õ KÂ=°å§k$Jö»`«,¢$êA–„ݰQn‰’ÿ ®I”Ð�’¨DÜ ²ô“•¨Yúµ–¨YúÉJÔ‡,ýKÔ‡,ýªJtkzvÊ›6�4…Šãd˜‡( wÃV9\¨ СHÂó‹P$aMóD ˜à`~Š$¬å`žüw«7˜ZøÛyÇ7i”kd99.A–KZ¢-üd¹¤Õ¸…'{� ¶ðK�%a-[xòßÔµjµðM�èŸ"qR| U&8ßôª|ªÕx¾é)ŠÈS-Ñù¦§PåSMå|÷’§( 1v‹”²^i¹IaªËx~/½ ¬Ñžžå¨\�` ]Y2[Wo£áä÷ŽmìyÒlÐTö@7ò´SfίàyP]'”;ƒÞA‰±K´ ”ýVÝtºŒÏø¿wñÚšˆ6éMô�&üJkôwÛèï6D?ºý'à·oöojó/åÛØ#9×Z4|sdÑpG2Ñý_#é·G–ç�»�ŸŽŸX²-?~âÛ ��œ|º˜ þ›³GîŽLû ¹1ãîÍ7Œ‘éÙ¼üñÑñ©£'ҙ㩑 LŒ,ö»ÿx8·<±ØF,ÎþM!†ë‘B%b< _¥bžž]Ö]çérPÎÆ&ô´£Ûޝ›i˧æ�Š»€ê/Þ¼~ýò�rÒcª%öbïXq&jýÝÆU•ÿ½»W†­yÓOVpg?¬_U./ÛA»6æqöl&faœÿë�ÖßÝû·ÿj…ëâºuóÎÔý”k2ü£_ü¡†•Î'�ÏáÆàB&7®¤ðFõ(”Š|U‘­ŠlÆÊšk|Eq…F*bO¬ªO‹Õ«AQ¸•5éf¯Pói'•§9ó0þ†nÙú4› üE¡„ëÊAÒÜiW‡ôŠQ<í*LD ‰*ѪpmÜz-êÀ6Ãn¡U¡IG+¸]Ü{{ò™Bî[ÄSëL¡Úy3p;l¡Ô)ëuÓŒ‘µŒr›Õ7 '6heOÅ$•+侕A<Šr¥ëb|#:}P5ã;ÁŸ/]¸~‡“êFäá~Øûæ”oùÙr凉^Û°N+¹¶!©œ"÷Ä#˜SuÏJ§âˆx² F<’ɲ³xº0í.êÃÃÃü‡„ê‘KØÝÚ;*%ïså”·Ûñ�±+«I)es”¿\1XåTÊ&Y:ôÙVñˆ ·l,±õ�\8‰5@" W!?±x#~iÝwÞF4õ(ê€eÏ#{ßÓ3®³  PÝ ì‡Ý/œ†«&¯ƒðÄDð—‚îõÿHÝŸ¿Çq¤é¡h$ $$€ ¸6‚� ’ ‰+REI�¨ÊR¬Ê,ef�D÷ô¾ï«¤^¦[êez�ÝãcÏx¹çÜ{l�g<ö̹Çc»íãsŸçþóÌóÜùÑ}óË|³*TAŒˆ¬LYOg¿ŸP¥Š7#Þøâ‹]øl_â4¥Uc› 1¶°f�‰·O–IKíê!Ê£Às°ÏÉR_ó˃À°o(»ñ¡eJÿ&ðì[Ê<ÚèJ‹�L×£SìI5‡ ° ¶T \s4-PóÅrÌ!Áo8 {2Eïš\A\JÕD»8{0U7ã¿hF}Ù.[_ÔZ”èNŒñ(Ò‡·ðûÁ¶“5œðž Û2Vh½ÉŽòæ¶šówÌǦ«à4qÉV¹$"©R£ä�sˆ'iÑ8k„òAںሸ £Q»F z8Ò¶ŠÐÙ©’·HW­†‡­2ÝY†~Üà.Åp`”N%£Ž™«¸žneŒ3ô'×ÍâV”2áØW”KºÝ[.štËæ²Ï/“/e…/#áÚšj‡(¶;›JnÍØ©fW…¨t÷ÁÞ'C©†K¨1¯ØVQI0¡€asåðD¦Dz�}ÚšuìŠ%²¥è7žt¦—L©Ö@/�=’R©ŒÇ`�ÅWOm·Ö(ݺ%r8{"™9 <ûLJ%r8 [*"­^"t °L‰\^�-åäÅKäðYØÏ¦T"3Àç`?[‰<‘�¯Œæ‹•É-à]Øw“)“ç�/À~A¹L‡˜áe„�^$/_…ýª2vÙïòf O7ó.s�ðòt½XtèÌ:âd~'D›Å&Ÿ­ï5–SSAô¥#ÀQØ£õW}i?p ö˜zß@4§ïåO½;h­œ”ú…j=#úÎ1ñÄôöM÷Ë]Ž*ioÅkGSa) �Sò ⑬–ͪt¨“²…Cù9–j^¢¹2×2(ê'¸£g‚ÌjÔ$§/Åü^#@µÿé`ùnÝb·�Ç7l¿“{ÎT0¦òSè¤_}˜‡��±×èì$òêc�Äü‚V9Zû‚¶â´W…±NúųÀì‚z )ÏPúІm+ó˜ ®Ö…Ð}«D÷IÑx§](”,$2ØŠ[æƒECÖ‚i¯ÀÍÁòß'íÜw#éãic¦˜ �¤MØ[¾‘ÙPkð#g;]üJ\bµØ»/ŸÐ8r–`ܦUÎÑiÓVlðRðô‹[� 6«+GÉm_Y¨#¬`x‹v–ª{ÖÈ™tc ]'ç7¿”—çHÞN\û�7`ßPæ|vÆ«´ÍÌõpgvpˆp'�ïÃrô‰ÿ÷¼Á|môÏx$þÜyH�³ß ­¸‡XyÕÈ’ž/U+í(ŽÙ£¥úRò ª…¾-ªth ¼•C<йòÂ�Ê"4¶`‡šrìÒÂâšn½¾rÖ$¸ª=[rÄÛ@îv!þ²EÅ÷¹vÛ.̤sÊëx]VЗ™žÏÛÙ²]¢W]Ô— V(å=Óÿ"WÙýÚS4¬!æÚôMÑWâkå/ T|¥ËÄÞ´–ìFxñp®d…žÉ1ŠÁ}^ùeÜuBG¡¹]òŠ¥ L³f.g8Uq[Wª]Ø!ù.[Cgê «…ÛëUîoU¦sž.ùZ¥è‚Awœ˜n�šÜzâ†×2Ù@™E#ó€*†èKô‚8áyØç•_âèÊEë¾·7­¬¹dfKzžeƒA¯ðšTŒÖ ç}¨…-5´rŒýŽ+Aϵ†ÂaBAZ B¨¶û©êz†ëw®^­Õ~ÖšÑ *{€{aï•¡$ÖlSríÀ}°¥€­È�&áÑýß„¨`ˆGð0ìÃÒ%Ó¡Zµ•kéWÝ^"HG«Y:5ffŸ„6 ¹}`ªI´º<¹ ñÄU]d.•àvØÛë_](¹F Ò¼ãŠxª<JY8_6Õ –)94¤|Vs3ÚzE×< [jTQNÀOA´O¥+à§Va¼–^çù„K¸ v|kŠø)—p7l© ‹•ÓÁeGÙ!ªUâÓ<ûHrZåN HS«C«0fg+³úuÚÒu¶CÐ&a|Îv´¬SÊŠÕÎ6ogô<¿ÉFTÄD¶ø ìg’ñ0„;œ®ˆ‡WaÌ"–Y0< á'+âaw8V­8[?+˜U*Ìû�CŒ2†t /À¾�œŒG Ý‘te<² 㕱ä*ëˆwD«zó[½„<ñV¹ùM²Hž) 9pÄ4yίø¡ó:ੇ¾Xþ�NDÕ5±ß¼ û¶ò[l&ò¢TF¡ëQU�WMuKPµÌV+ÊA¤6Liœ‹’oàOÒ4¸I¶scŠ&;á�]æ.Ú¥|–æï—̬ÁCwmKŸÏlÞXÔ—Lۢ󯊺㙙R^w˜.úã N8{Jù5v¯nI‚ú*H�Ûõ˯‚‹É�6qÜ$“u#Fû€‡aK 7‰ùRJ®¨ÖÓá?=4‚}".-Ê— # #C즟A ŽqûÖÕAáˆâð*ì«ÊT‡‚¥´,Z1.‰™»xstææªãš‡ÂÕN�«º·%¨2½¨ãÈEÂ3°¥Vc‹i�’ž…-7Ä*¾�˜ÒŸžƒ}.yoÿ4a<Þ¾wÆbz6k’d‡èZjæ–Šš»AÈ"ÈñxöÂî�/ìœ7ÌšÕ”/‘9|ö“õ—/%×| öSÊåµ·2Õ,ç\°— Zä¹h?^†}Y™àåLJçMÚÿá ~׎‚^ò—ájT#ë»ú¹SwÁòN×-#’ž‘ž}9 ±�ÔT—¡í %«VWOiáŒK„ ϾœF¦Ø =½ ãí„ní‡ÄúEñiV¹Ø¤^�’kvhk.6‘,•�LÏ?Ô—£ÆtW¦œ:�ƒ°c+§F“L)�OÀ>‘L)= < û¤r)íb®ßé·¼ü2#��Ë‹ûkbt ø<ìç“s*aÙ˜¢S™X…q;Ëo\3#ìTˆO 0A§BÉ5ßWN…uëàTPL2¥4LЩPrOj•Xâq*;8§âØ%KxÞ’èœ> [îL)�r&,ØSô(gVa¼¥¹?³¨;zÆ“TˆQ °vgýÕJÉ5÷ÀÞ£\.#«}J0$ndÌ‚ž§-*Žá–7'ˆ»âÚ¼ [¾°¦Y(—¡L^Þ�}'™"¼¼ û®zÕu0”ü âIÊÁp»Ót0gWaÜö‰ã†µt0”\#0>3>ÁE+z8ðà- ì{ w]dlÃÉÙp±¨œ‰oð9ØjgWU½QVwGP¤Â»Šhl²x¶Ô™û5 t�]E͓ެ[€Ê2\óË�Àð×_à“a±È­$WxÖŒ?Ô�` 'íâC_rPø6¢6¼ûR]´ŒP]J˯MØf‚Z^¿‹±ë[À—a¿›–Ÿ¾ûõd´< |ûAò¡%Ÿç�"�Mº•­9çB�XÇÝ¥¾ËQ§pÝ!n 8¬%¼»”g.Á{°G‹sw)ýbtüúˆ–ØîRJn³V¹%!žÝ¥Âµ‡’ãOLo¿Þ’�S¨!ç�)-Ù¡ä8Ä“4�g�JçF�rpùãÌÖìTÄÊš4Ëa yaJåp9¡|nà˜ºÇ£S³#vQ =R„xbê"^3slÀ1Þ(™Žq�6HõŒ1Ð?{û]»Þ?ÄüO Eœds³w¦ƒ½‰S%�Ns±¼�±Ìx¤Ói)îLNôÝ.á}_„-}ÔÜšd·ÞÏÚ–ç.Úk$½øì—ê§¶u³à‡xy<€…%è÷ü£û¨ã[Ôéø9{Å’Ó6ð¬áC¬¢`lgy¢Ÿ&åuY¢ç…߈Û¢4ÙÉ(þÓ‹À>è±wàgKšÖpH»òBƒì†ÿ‚NeQ-Ž0~“Ë`ÕoCˆŠoré€_‡ò4°Ô:æ“7Êç äÍá–¹¡òž£!¬¦áÎâ÷·]ýèXqH_ñUÆ2~Góì0«œz Ç11âÀ ¯+qÚÏ‚*áì1õÐ>S{×wM*3HžP-¶WsÜIW1¶ÖíÙù«¦ëÍÑú]w ³ÎĸºãA²âtiG[]2],â”Ë k s-å ºŽ´#Œ'ƒö`tßWÑZj·4ïå£%ánÍ%[5Þ+BîH4E†G°àˆVê�±\àn.ƒÏò[=ëˆÇò¶Nw÷,^ÍuÅ5yßWBn ¾"ïؼ‘ÑKÔ’UŽ—fYÛ?°èT:Ãcú¼]ò¢·©¹–µ&ù[ Lx¶Ôø òçV;‘öB¼ŽÍ‚8!7S´ÜöáA¥x—vç4»aw'ïÞFfÜŽµJ‰;J‡xbË‚¨pjô¤èµç´8ýžp“’oàP¾ŸKíS¥CSÏMª-H­9f¹¢ù³¼ ¡ÂŒM4ïy"^…¹ï`ì.YÞk~¹Èà[ŽÔ³¼‹jCÈ�ƒ¡X…XxÎh”Éá½z¥C'*ib7|¶zT¸f½€ Š0¦8+ìÜ–¯£a †E“Qî%ø"Hªµ ëUý6µ …_B½y $[dI¾gÝ_“l#pìn䆢øk5#~É1¥ß ìÓTol¨5¬pÚè=h�pl©•"bº¸-vÁ–ré+ Hüº"Ð Ü ;�ÃÕîA”÷´'<'.Ð{¨ ÷ ÎMe?Y-�6ù�¿ß Í-kiP‹ßË�$aìŽúËóeH’°¶ÔzUy�=À.ØÒ¡ÏãËóeHòemÅùð‰Ë“Òß Ü[®š¬'Ï-¾<×»“®»û$a=éª!Îû$a|‡tIˆ“t;a'°¸ñ>y_«\M¡¾¸Q\œ”~°¶\%YOœ[³óW oÆÊÙ‚ô^�"_Ñê³_¦†:_�"_ÑâÜ/#¡ÎW ÊW “NY™ˆ©ó(ò­ru ‘�°:_�* •›÷ =gÜYCÏÞ°òË‚ _…(_Õ =_…(_ÕR=_E©¼ªZBb}¢$L3ô¤ô{€õ =·’@ïêy³Öœµè½E&è>_ƒ" SuŸD ˜ û| Š$LÓ}RúÝÀú¹Ïá´NåªIÑa�@™@jÑ–s>¾J?eö–«»Š*%}@›Õ_¥€2 ÷ÃÞ¯üþÂC£”|?‡x’¦¡#"Œg„¶·TeÀ!Q&8à�ƒ( Sp Ÿê&8à�ƒ( ãpŽRé‡z8ÄÓÛÓÎ CÏ»v•”ïॴ8ãcá X«Uñ(„Àü·vW Ô).jáÊ)Â^ØñE¿[|…Z£èÕHy°¶”óV+#Jžqˆ'¦2j_»ÜE�Ÿ‰B!Ü ;>²^™(½%ßá’Yó­†Ùl•4£^Çkkš„ÿ o¬¾Ð’þÖJÛþèö߀ßN¼ÙÿHç!^Þê·y0Zô¥«{Æè’îŒæì|ÖpÜÑìë£Ë‹N;�>ùÐzmùÁžUxpôÔ£¥Ì˜ÿÏ‚5:7:ëŠãúÜ�{úèì|ÉôÿÃñ±Ó'3ÇNfs'2£~�-èÖhy5õHT%¢ÐJÎÿ]¹|z){¬RÒÐ!v…êÝÎæé¼°GË~%Ÿ`Y›Y¶ÇŒ¬éÑ‹ºUk,ºñâ�kצ¯WÓ×nT;º:*Aíïÿm^Ó:ß™»<|*üð‰ß¬âÎظ¦RN[~ÃnZ •²ÙBÌ‚Œ™úõfóîü[w•¢ºyãöÌ‹/dð¯^凚V'f׿�ƒMoÁBúrA7¯¦q¯~4Vª|M�môë,Ý^±ÎWböh¤¤añDÊú„œc=vˆÝÌ´m0ÐýÊ«ÑM‹ÍŽ^Uâµ¢¼ ¹«¹ g!%œC<4ª^ç»"›jQ»;={¡ µ�ZØá ¬r7ËãS«óW®©Y“ìà.Ø»’/J~7‡xÞC{ pl©ªšê÷õ¼©WÛ¾Ámº¬vãFR%CÉwpˆ'¦’é Ë…éÌ ®R1­›µ¹nFñ‚}(Æ¢òL/_­q'êñ7?']T”üñHUÃãÒ©9ŒñŠ B<ŠÙruEe¦-vÖPpóÔË™F>뱑‘‘!?®{8Þ�Þ+3Ä<£P´Ý¡Ó.O]½=-¾ß®¥KÈm¼�Ma%W_¨¦°¨ýߢ­ˆ0“VØ–Pe\52!¨°vU:Á8#‡xä¯U½ª�$&Ȭ iZi‹3 =±zHqŠIði¶Ân�Í‹ÓpÅÄDe\©|§€gaŸ�­^­»ãm×ä âR“ÁD{7pö€,ý5¿Üœ„=©\ñ·2{þuÿ}…çˆÆ9àeØ—•é´é•[Q¨ç-Hª9”d€m°Û”Ä]õtYn3ºÁà8ìñdÔÝ4Y¦-Azðlé`jÍ/w¹kÔbËŽÓÍø"áqØr�?þÓ #ùú4‡xb{û'@7q•äìÉG”üIñ$Mcr BùxjÝÈa�»ak1#lÔ*­µZä°i£ºq*ìj…!3ºä;]©[úZ¸g°‚1ûÝ�Ùù[%Û3f²†å™~ˆ/~(ásZeÐs!&áÛ'×З xö•Xü0á˜VÙ|2b½ý0á“ZeKÁ“!ªÆ#ìF1X™K¨ _›Fø°» ­å]ªþ‰bô&W�R!HGm,¸(ªÚu’Et’é¬|.s=‡ŽîÎñ¦1Ÿ’õÕ“lxí)ç£Dó®�CîÂEò›éV&He;òn»r>V]bÓäÒk”KýµŠ¸ÖH}i°vgý+ÿv÷ÀÞ£\8â‹ è;]À*{ë]Áv@ ;b­`ÍTÁô|^¢-ßÁ!WF1·å›f²Â�71ê‚ß îº�÷ÆÉÑÝHIJØ»/–Öš~±x¶Ô ³X…ÝÁ=G*¨¨Ôã¡ßÏØ…¢mù�‘Óš+åóËì�’ž§X)«ÒÓà˰_Vf.Õ´‡u!ÀøÛ�¿V¹™E£ ³IÖ_X~-ü—þ!äžÿG®¡¨Uÿj¶Dzð4ìÓõ^;‡°'’ï)Ròg8Ä“TC�òð}ÑPìäp»V¯†bóí[W…[ ¬ö ðl)W%ÞRlšô KÐí2Ø,–¦‚~±8[z8úñk,%·8[n<€ÿt¬ÒE@�n*©ÝNˆVpbû$ð%Ø/)³Þ½`.[2œyÝ3 CL¦Ùàd(.¨VÇú¨ŽáÚ‹¾™8"ÜNË}À ØR[Lu”\ð l9Í*ÜNPòg9ÄÓÛ¯w¯HkEjc™b-S —lì†äó�_5´±ò$M£9a}”ŸW8rãvÁ[£&9Mpj^Åé©i3ØÿË�í,…› l'º}0çø>Eø`K"ܦU®doÓ$#Oµ²åÎ.R,[þÓKSAs•]“m,¸™„†1ýR¾T°‚/ºClIÏ—ð]çè ghØ^‚}IùM:+| 7£ýw šlArÜÆÍ Ä7h’#RõžN ‚§€ÏÁ~.™8S}:�H> [zúqÍ/÷Ÿ‡ý|ŒÙR£ýïFÍ$¼ [jIÖÊEáºEé_^‡}]™ÇÞËäñÃêÔ°’…:&L�;ò¶Úñ·IySnOPŒÞtdŠkh&•€\®-”w|H]wÛž„#°GbwMÛ*Çû¤¨âÒÖ\w[OŸÔ<)}\±mV¹îVÁÑ/â°›j×ÝÖËõB„U®»Mj� %?À!žzw ¢V›’„­> ìa(ù'9Ä“4�>ä@„õélUC} Ü {«t`5¡Ãáq@E�<±Õº+טø[´³® çmÀ£°�Ö_Ñ åF8{¿,<~JTžž„-µu¥jªOÜfwjT\Ò倖ª;£ä8Tsg­ªtÃ)#Å\ÙFûc²FN/å=&ÈèI” !·¿è}â`£%.„ûaï¯=Ž6zöÃîW.¦V #‹Ø„½,q9ƒ=¦TPUOiußÈ?N‰­Çò:ðØqîÎYgD¿mr%w æ“ÀçaKO®ùå“ZyËP`¿šŒˆ�_ƒýš²ˆ7ÓB6Q·G>ÌÂÎÆ®Ýæìüô##SòÄeK­bðì8Ç–Þc¯3hK�nvhkŽíVP,ýb#�T¨·b¹ËjËÝ ©1.ÅIqJÿ°V‰›I*òØtdžåÎâÓ¸£•b®8»V´ÒSŽc?®ACÈ'ÂÓ°O'SƒvN®å/Á~ðléú¿æ—›�°X_JÉmž�­¾¾t�æÂ2+¿ ï�¶X�í,\”+\ãˆæY`¶\Á*ž£ŠEO§E[Ÿ…:í-<×$B<1ilÛý¬áf³X9!gMŸ†2jT%Óè«Ï�UÏ¢ÔÀ¡Zïo§*�1-Ü¡üþhþÓÉ zæ�aeÝ`cZÞÔ-�ªéÔõÛ3ìö­«ìôi–µ­#³ Úr`3{Ép3k0Ó®¨GQ<„“°'•_a¼ü ÁL�eÍ\Îp ÿMè ÜeËÓùÝ&«Â]�÷8¸ŽkªSâ*½¦šý\¢tø,ìgëßJPrÇ€3°gÔ.áM�”þsÀçaKõ½Vð8?¿BU´ôÔ1òËœ¸êË.פ šÕÑ—àNˆÕÎÃ>¯üeÅ{‹¦‹áj{|ã1v€O#éãi_7Ñð— “H�0žÀšÿÖ{.©éˆOtØö-Äz n G@Émî‚-7QËú‹&¼˜/]:¥Ü-‹¶ƒ3ÌUMDwÏÃV¯l{n:vÆpÝ`ßö-Èl 8 EV¹C:¦nÛn¿Õ™µ:›³/›.„ûmDñ ðìÉôÛvMVy ú‡€§`ŸŠ¥ãF¿Ø¼ ûfýk"%×¼û–²°{ؼ‘³ikŽžÏÓ6*u�¨Í-ØVò�É)T¬ãiL©1)»-ÛÉ9¯JÌôw=ñç4(F]¦Á÷OJ´Æ€çaK9T1¹SrOŸ�ýŒr!¶@ÚCTP¢º"*SÀk°¯©wqòºG»å‚õ:ó¾Ä²z‘ÚAÓò»;þgþG~p\i`çèZRáj9Q*uqª¦ºå~Öðt3_méÊR;kMv”|‡j½}ú¯«ËÙÏ…’ïJ ¾¢EûÒ¸V°¶TPÛ«šcD£‹Cˆ—Ì0ð,lõó››ËCQ®hµ&"“À+°¥N`_¹†u âi\áy¾+aIØ [=ôØS²*ó ÁyÁÂ잣gµ¸Fíùo5\Ÿ•2µÇ�À-°¥6¿ˆIyïN¸öVåRŸ¦ô›€Í°›•yì6-Z'¡{&u±ÃÖI˜ÚsÈÂø®9Ü‘-óf†¦¢ƒF©æMoµh=*„;`ïPϱJÿ¯6Ó›Zèy{`÷È0ÕbÙAD4‡x’.¿[(³SRó,’ž�•ÆÍæì|Þ~HÈeå‡rÑGQw<š¦‘èÐÜKÂ*7­+ªû­ˆÕ1àì©úG”Ü0ðì ÊŸ5ÜofDUE4.Ÿ‡­¾í©Ïff¡èØK‹B3ozËLÏ8¶ë²h½šp»?!r›( ™/y�äy¹_º0ÃÜ¢‘1s¨ø®UøÒ¢; H¨vÚÕ€FUrW }z„ò‹r‰ŽVSú5N>x9@ßQù˜`.¼° ñ¤Þ›'>-ÀݰØaÿB¨¬;`w(—J3À.Ý ™òéî‡-7HWõâ‚àbi™²*�‰—M?pö°z÷TØéRú#ÀQØ£1v%jŸ�~7,BíE-Õà‹’oà0¥®ÄKÈ�ãÉ�'ýp™pz5Úf–nqpqþu9(î ßGBn÷½"ߙۆ4Ðý·ùÖ¹?Úí¿KÃý ½Óp4ëy‚ ÓaÁ5î¯ó2^��9JZ÷‘t„Éuìo"µWÒ­�¯ F˜Rm|9a}:ö-+D.Hñ5-Œò;4ÕEXcª9F4º8Ä“tÁ}…aJ2Ö‘´+ ™-"óH�0þ-"R+FˆJ3°¶Ôü‰XÄEÉm¶ÁnS.“+v‡TÖŒè.Æ^ćåçñ=ÂqØãÊD¯øývL0ÓKóºkÐÝïÏpò�ö(úMD&º�æ»ýfÕžÝo;\á~rš#ä&Î$õ·MµbÒŽ&î'ÈC‹³Ÿ|˜ÍähN£|�oåF.ÒaxÛ¯pgÍàð)ØrÃ1õã3P9Ÿ�ýLý�%7œ‚-5´¸r{d¸ >k—¯Zó LØo§ À`¿ ÌmgÑpõ¢K{Ý¢%©‚ÄrP:!´ ·°ª’ö¯]þF Q‡Ø#6ÔamQŠÝÀ Ø œvAÿá.à­|«ZÒ± ýÐY¥oS“s‘ a|.rÃöp½�K_ùÀá~Øj£Xõ\ÚI,§�÷aß�QÌõ^ÚI¼G€`_�å¿æ—€¯À~¥þÕœ’ë¾ ûUe�wOø+ÐîH´Á†?ÛÞ9F¼^>‚ý(¶lYoD0VmQKµóFÉ7pˆ'i&r Âôú�¯#uÂøû�›¹ÃW¿�&.ÍÀ6ØR½9±ÊKÉmn‡½]¹PÚ+�H:fÞîfŸÀ~ØýÒE¤|àµß"]«îfå!Ò¼g ѶâFMáð<Ïá.Ør§SHåIùPˆ5OöÒªý`*!oºAXEG+WEó§À!ƒÍiw ;,-Õv‡’oà0¥vÇFDOn4ÎH-4*‚a#ìÆØšù}âÓ ì€-5ú.ÖüPr[€�°Õ·I¶¬Ô(¡=Àƒ°ÆVBRçæ•§€#°G’)œCÀQأʅÓ?Äm¼ÆDú’næÃ?XL­àÄo x ö-ežã®‘±-~p0ië3^ð;!LÏ…‡CD[ Âs´o„úpö¸2ï�ëv0^^·V%ö§E5C˜­†„Ñõr@ùO/Lùy¸PÊëÎP0`¿ê¢ÊîðŽ…PlM¡‡-.¸^€}Aù=zvEÇΠîªG¼{a÷ª+ƒô»V·4bD52šDVF K±*C¸�_BÒÆÓÎ?Kñßcù¡íÐYžAo†•hF,çtn¡_ð•é whÕ5ë”唱™úo@Èm�R|›ÁØUÀ²PÐÁÏ-ê#|·`OIô‚álYåÝ‚/¯x=Ñ—z„!¼û†òK7s+9ð=ć`ÇyUz !QrÝÀA؃ʥÕTö=¢ê!O�Á>¦Ì§mÀ�´hÏ‹™¡î‚¨f>�|rÞ É®–Š­[OT:€]°¥d,&—�à‹�T¶‡¨X<âÉ)ý½À}°÷ÅV"û?ª…cr„ nìÿ(ÔH¸öÖʃÒoÆ·±¿5ètbÍ–ðnŽ�!?[a«·‘ÛwÍL>^þ~“fÂ��O é“[\ÿRû¤jÊj@É7pˆ'iŸBD¨¶¸~ëãÒ©éÇ>­…8B<19Ök~o{À1Þ(™Žq�¢$=蟽}ëªéýCÌÿÄðòËl’Q£8877Uòì¢ï¼�±Ìx¤ŠyÃ�ɉ¾Ûgð>„/Â~16Ío½Ÿµ-Ï]ŒnªZ“ôàK°_ªŸÚÖÍ‚{âQä1–±-vv˜eç/†#ƒ(щ‰‡XÿDÁ(ØÎòDMO^“ög‘e„c°Ç”iï_¹ìÖ Ÿ¥é˜®/DqžŸ7Âý°åVÃñŸveçg =»†¥8¿Ïƒ¡Zç‡ÿ´=;Ét1(Lʼn}dÛa·ÇævÚ><¨ä8¾¨…΂°¶TÔ+î8¾ˆÌ Ü {o ŽƒÒßÇ!žØ² *œM½ö—´TJ¾�Cù€�$:¡JçËZeG(¿ªˆÿ´ïF0ÄréÂÌÅÊÔ%ÎÜp'˜(ɯ ¸û`÷)UëjÕ{ç ºÃ™¼îŠ ôU-¾û*ˆ¶È­Ñ}«, ^“l#�Áfõï5~EA_3%Þk¤ôû�`Ë bgiUy´dç§ŠEÃÊÊÜ!ý5ˆ�° vœã,5„ñ5ˆ�°v ã,â[‹ˆÀ^ Ò@‹˜B¿UöÀîIA¡”~/°¶¼«¥Ðö •¹íöë�æ×Á±E“œô“é×!ͯ#{¥³GQ¦D€÷Öòhb2ý:¤IØ»?™Rú€a˯;[G¦Õ.eþ¤ù�deú HóiËô�æ7’•é7 Ío¤,Óo@šß¨«L›üî¨îésËEÑÆþ›�$aìŽúËó›�$a'lõ…¬ò${€]°ã vjÈó›�$a7ì4&•(ý½@õI¥ZòÜÆ�–2üDù-N‹&yžµ˜@¿Q~ ºh”Õ…ª@¿…| ¥Ó­Iކˆ ô[å· Œ ÒÂP(¥ßì…-Õ|®+ЭÙùéGF¦ä‰ºÏ7¡HÂzœìWC�oB‘„Z\'ûI¨“t÷À޳vÖPç›P$a|ƒºâê¤ô»�J•ó½zóÓÁ�k2½ù· Ê·´D{óoA•oi)÷æßBÑ&Ø› ª$L³7Oé÷û´zõæ[³óW oúQÆ(Jeö6dù6´Ò"«1‰¾ Y¾ U4jqÌ3HHômHómheŸ¬VÄ$ú6dù¶ç® q‰¾ i2جM¼/Ñ+g Òû6I˜`ÿm(’0Õ&žtlâ¿ E¦ÙÄSúÝÀú5ñM�:o•Œš[Qkñû$ù-Ñüw Éïh)wà¿Y~GK´ÿHò;Zºøï@–„õëÀ·Uä)3ú]èò» Ø"[‡Ä4ú]èò»È›Fé¼QÔ(è*ubÅ4ú]è’°¶\짦QJŸ•†€ßk�iÆ¥EC7¬¼¨ýDI˜à Ó÷ JÂT™ˆ@70ÁA¦ïA”„i2Qú=Àº2͸wé:QAz¿ E&�þ6I˜jJ:� F ¿ E¦�RúÝÀúE ¾û¼jºÞeÓÈgE—}¢ü¾–¨ûü>Dù}-e÷ù}”Ê÷UKHL ß‡( ÓtŸ”~°~î³%è�ð jAŠ?€* %: ú¨òZÊ£ ?€2 %: ú¨òZº£ ?€2 û´z�‚B¡³á•æ‚ß�*ßIV¡ï@•來Ðw Êw’Uè;På;)+ô¨ò�º*�|0�$*Ðw!JÂùw!Êwµ”ùwQCÞÕmäß…(ßÕÒmäßEyW«g#¿Cõ¸èB™?Å-Þ¹”*ý!”ùCäN£tî(ª”ô™¦0™"¦ÒB™„i.¯§ôû�õ[^ßÌíN$ø#h’°¶Ô¸¹˜>Mî�-å¼UõIº€Ý°ãœë­¡ÏA“„ñí)×'¥¿¨4Õ»®>·sú”¯ÿ1„ùc0lÑâ�ÅjˆôÇæ�‘9�Ò™£(R"Ð T ÆÄDúc“�Áf)ˆ”Òßì‡Ý_�ÞÒ¬Q°— 7ú¨’0ÁÞÒO JÂT{KD`/0ÁÞÒO JÂ4{K”~/P©‚¾W3Û°²2³ò¿M&ØÌÿ4I˜j3Oº€ 6ó¿MþŽ–n3OéïÖµ™/ëS¦™ÿ)„ùS-Ñfþ§æOµ”›y"Ð L°™ÿ)„IÈ´ôšyJ?°~Í|[(ÒÛžît:ž ÉŸA—„ .ùtù3-å¥#?C%ù™–èÒ‘ŸA—?ÓÒ]:ò3Ô‘Ÿiõ\:²3;'¼;SzÜéçÐæÏµDOSø9´ùsMñ4U�þD¨äLÄtúsh“ðlõ“WÅuJé‚}(v�nËÎ¿à˜žT�é%a‚Ã÷¿€( »´‡ï‰@70Ááû_@”„ißSú=ÀºßW*’þÊü¥–èðý/¡Ì_j)ß�> Ó¾ÿ%”Ißð½ðO”|?‡xbz{:¡Ó ª¤üe¼ô¯€x’΀_…u«Œx$kéêÚÙQýŒ+AŽ¿«…'oý.äÙ¤Åélñ%jÑ6²)o2-®Ž“p!ý.*I„ûe+KÕo5Ìf«¤ýó{xmMFŸô�úF ~¥=ü[+ýmSø£Û~$ ž פâå­~{´è˜K~GrtIwFsv>k8îhöõÑåŧ��NŸ|h½¶üà Ï*<8zêÑRfÌÿgÁ��õ Åq}îÆ=}tv¾dúÿáøØé“™c'³¹™Q¿^ŒtktÅa/#QA”ˆF+Ñ8ÿwå‚ð)nÜü 5 bW¨^ù¿’¥+ÓûѲ_ÑÆ'èvwº»ËÈš}°¨[µÖ7^¼qíÚôõjÚã|Sp÷<0ÒATŠÚ߇Û¼¦¸3wyøTøá¿YÅ�ÿ°qMÅœ¶üÆÃ´*å³…˜3õëÍæ?Üùw¿¿J… Ñ Ý¼q{æÅŒ‰2øW¯òCM«ó’,è N)—vój.÷êÇe¥Ü×TÞF¿òæLŠôk~%f×FræO$¯OÉyØS‡ØÍ¼A7 âÏÚ™àž=h…L‹ÍŽŽ�W+ñúÑò„§`ŸR~á|¤äOsˆG‚†â¡Tw§g/TáG7É4«Ì<>¿a&]R#Ù À.Ø]É—%ßÍ!ž÷Mé�ßì‚-•MUS}⾞7õj§Îr÷RUÛÓ˜TñPò{9ÄSñœ ‡éÑ�‰ÖÊËÐèÿ²,¸½’…Çì`ŹàKlF¹žƒ}.Æ2ôL/_­ŠmF¹ž‡}>ù2¤äŸá�d6<.�šýê'PâQÌ–sk«:�n ÷ý …×6 ±‘‘‘!V¹©s’]žºz{ZüÄpîä@SbÖTÉÕªi*Š ¶hU;ÇIijK¨„2®ê jªM•N0 Ë!y‰kUoJ"= 2k‚FšVÚâÌFO¬Õšb|Z€­°[ãkoý@zbbÅІ¿§€gaŸ�1ª :n[ÝåÚ5©~�7ÑÞ €= KÍ/·'aO*Wü­hQ…ǰ‰Æ9àeØ—•é´é.s ¯äXa�]�Ts(ÉÛ`·)‰»ÆR¤èž‘ZcÊëŽÃOFÝM“eÚ¤÷Á>‹¦é;€Ç`‹1;jŒ°7ã‹„ÇaWoCG$òõiñÄöö¦æÔ¨¹Q%9ûDò%’CžZ7r¨t›a£Vi­Õ"‡M«õнɕ ²‡XÑoìÂΖg3 ªÑ3XÁ˜ýîÎ5û‘„ý/ásÀû°ï'ãÛ'U·Sµ„5À+°¯Ä⇠ǀ¯À~¥þ~˜ðIà«°_U�!FØ�àäC—éŽ1!ê_`¤µ¼KÕ?QŒÞÄ!I:šhcÁEQüp†b�d:Ë,ꎞñ ÷kWíÃ?¥pùW–]ºpí6ï£Dó®�ó°¥ú+gfŒ‘…&He;òn»r>V]‹ÔäÒk”KýµŠ¸ÖH}i°vgý+ÿv÷À–öV\ŒCßéVY_ï ¶bØkk¦ ¦çómù¹2й-ß4“n¼‰Q?ðlé~ˆXã½qrFô (bÙìƒÝKkM¿Ø < ûpý+ìî9RAE¥ý~Æ.mËŒ\’,µ¹R>¿ÌÞ(éyŠ•²*í1¾ ûåtÚ�ö°.;0â×*7³ht6Éú ˯…ÿÒ?„ÜóÿÈ5µê_Í–‚Hož†}ºþÂkçpöDò=EJþ ‡x’j(PÞ¾/Š�n×êÕPl¾}ëªpKA?tx¶”«o)6Mú„%èölKSA¿Ø €-=ýø5–’Û„-7À:Vé" ƒ [ÙuÚ Ñ NlŸ¾û%eÖ»Ì%ÃbK†3¯{faˆÉ4»ÂšànØ»•êÿ­>ªcG¸öb„o&Ž·Ärp¶”ÃS%×<[ÎAóŸ ·”üYñÄôö[‚öÁü`µ h­(Cm,S¬ejá’m€Ý�|¾Sò9Ä“4�ä@„õPÞ,g¤Æ�  »7†(N- ´q¥cS&YÎvØÃE3³èGˆG3ºÅæ –5<Ã)˜4½·dê¢yÛ ‘>û™ØCŽ–nÙ:- ™˜0­œá¼Vþ¤p@BCÀë°¯'�ôTÞFw×¼‰Ä{´5…�þª¿Œ•�Ú Ø7êßfìA %¼ û¦ºÓ� ¤äoqˆ§Þž»“{ûYسɻLJþ6‡x’¦Ñ…ˆ°>ž{ãȈ¨:¸Óm‚ï5†(é·W:|Ã�¨VÔ?Úó½³»r*ÐÿÛ¢�ue8o…}´þŠæ–Ê ,6h’ ,Ô¤DÉãOÒ4¸cWê¨è­å唂ô¸Ã‚9šFMr¹NÕxdãLŽIj×*�—öcêfmš›½3-Ú—â” vÃîÕV솭W»HÉíöÁîSpÿ�ß…ÏçÃÝŽXø]^Št9EÝ ñcÀ)ØSõw3Üîqíì É×oJþ"‡xbzû¦ûº³ìª¶Aa+^»GSõ-JY@É7pˆG²ÊnV¥CUt ‡òkÛ«y�]UÖ¸ �ÎPuÆ ôÕÎÍ«—GéƒF«&½~5\.ê2Á‚êÓ*Îí ìƒéºz¢òpöH2s8 {T¹`Z†˜i-™®9Ÿ_­EDe xv|ChOÜçOÖÔ^Ò%ÓRõi”|‡j>­C•Î~-i‰�$–«Ze½B^�Y¿¶C„Üö…ŽÑzqîä¢ç݉ÑѼ™32Ë?Zq†óæüˆí,ŒêŽgúqG]O_0Üz›Æ£¢á˜ÁþÚš¯Vcß!½Ònà-ØR#�õjÝåWæ9�¸K ¼ïK°K±õU{ìpeßÓóÞä‘—§9²¯‘ úø-ØßŠÍË4ÞÏ™ %§š›¡ç€oÂ~3FG¿|©j²mÀ·`¿¥,©ÕEÔº²P$jô�¿û÷c,×slk¡FÂßþì?ˆ1a¿~åÝZbØüCؘ|›CÉÿ‡x’¦Á�c ¼�»g�œ^Ê{L�ÑA° ä6 ¼Ÿ"z¢¶xöáúŽ”\ ðlõa1âX™*rƒ)ÿÙ`[8󖋆+ª*b8|öóÊLOع€Y¸3ó\ºëÚ38q¦¼Z�ߺ.¼xí4Gxö eîM´t‚þwœƒa´•H~Az­V¤mE½žo; I> ;έUëÌ·µN® .Aë9µvj’ÝÒª¿­=[JGbN‚’krÛ½åÛ Ü¥¤ôOOÃ>­ÌcÏ=óÀ°²ä¢t�™…b>8XY´RAE"ä¦$c®T~c3U,út£±Y�éðìkÉÔ¬�“kùK°?< [J�U¹xöõúW/J® xö eY·3wÑ.å³ÔÚšÔJ,‹V7âs¨ÃÖ•yõЉ‘\-óM7::QØ#  žFƒØ=Ê7Ýq &Èd©rçþ¼¿šT"·8 {ô†&•cj0À·CS˜A[óËÍÀ1Øcõ¯ó”ÜfàQØRSë+2y�&û3+ÏcÊ9v!ˆ`3v¾T°ä‚o¢9¼ûž2Ý}ºK=º`%™iùŒƒÞAŽÖ0{‚'Q竜 �Tß÷)$a<}_m}ê´i-Ûó≩l»Ÿ5ÜŒc+gɬœ¦ŒVÉ4úÆêÃXÕ3†(5pˆGÒ­Ó]Í­·\ÖÍ|É1XÁ÷¢ÇÕÐ4S°v‡ Å€Z—jŽ�„?RFZv9@ß�f˜`.̬B<©÷è‰O p7l©ØQÌ!Í„Ê °v‡r©4³,¿ž�)ŸNà~ØrÃAUÏÑ ®ÿ‘)›àl©öL¼lú�ð‡Õû¨ÂN—ÒŽÂ�±?Qû„«gÃ" ÎmO1£ä8L©?ñ‡Ô ãY�¼"U™µ D¥Ø [jE,â¢ä6Û`·)—É�rJ«Y*«t0âcósøá8ìqe¢Wü~;f™Ê—²b«‹N<ÃiÞeËÓý&"ŽßG3«~³îxs…ûÉw 9B®Ï,©¿mªó®zÊî'¿€xA‹³Ÿ|˜Íähb£|ÙJåÜdÒax'‹pgퟂ-7S·�¾PC§aO×ß“PrCÀ˰¥ÆWäHGxžVÖ.ŸŠí—š°óxõŒð>l©[±Vn×*΢^téÇh¤ ±!wBîüû˜ä´íj«ðÂàGl2¨ÂÚ"žÝÀ Ø |MÉížÑÊ`'ÀPòg9”>øZÎO¾�Æç'÷1¬——7Ñ`°ô� /q¸¶ÚPV=WËià}Ø Ý•ËJBâ=¼û‚,ÿ5¿<|ö+õ¯æ”\?ðUد* ¼{Â�âXÁvÊí¥YÛ¾?�x½|ûQlÙ²Þ°àݰÛËRìÁQò âIšÆËÈ�ÓëHÞGê„ñw$×=¿fM\š�mZù®èzW^Jn3p;ìíÊ…Ò^éI†ì ÷µˆÏ­rf׎%‹¨IU»¯„?RÆ„ûZ¯B¤¯jqÆm+¶§ ‡ç¯r¸ ö®äòä5äÃk±æÉNZ$]Fà«ØÑ…Ïx�Cµ$¥òåȋĚ/Ýkó…:ã†^ÍžpØ»O™ß±�ðb� ßézôÿ~§ÉÓÍ`.%”¹ž£k]ƒ}ã~ ,<½¨#3 ¹­nI•ë<’œ�µ\w­(×ð°(ÑŒ™ç° vW"Ö+ȇŒ–j€EÉ7p˜R€•EDOn4ÎH­­3@€°vcl1–üúâÓ ì€-5×$gQr[€�°Õ·Ÿ¶¬±—(¡=Àƒ°¥ÎôŠï¨i¢òpDKì¨iJîpT‹ë¨iºÞ´¼¡Ý/Z¬ª/éf>üƒÅ„-ñÞ‚}K™ç¸køM%¿¹:X¢@Gù½m´šŽ}l-¯HÈ…úpö¸2ï�ëv0ßS^¥Yž öýE5C˜ír‡1)²½0åçáB)¯;CÁôÔª &(»ÃcÉCi°5…"Ÿ/‚;áØ”ߣ7`WtèDfÓ Æe8šàEØ »W]¤ßµº�®pަ …•ñ:¾«2„ÛùH:ÂxÚùgoߺÊËmǯJ¸¯Dó¿9Ç0òË$ËÊdœ;¾„£,§ŒÎÔ<Þ€0ZG÷¬òÛÜi–…‚~nQÏá»Û¨¢ ç†+ï|yÅ뉾T/Bxö å—:næV8rxîª o³<6-¾Î[BîÌŒ¤5n#é“[=v ©c­]Â@É7p˜RŸâ ä@„j«Ç{®f„èháÐh„xb Z?âW°Çx£d:Æuªøä0úg}×èwBý€ÎÿÄð|_8É(¼d‡³µ_/÷§×þƒÁQS%Ï.:¦å |ˆ`Æ#�NŽtgr¢™á"?ûó±U’­÷³¶å¹‹Ñi¦k’Þüì/ÔOžëfÁ9Ä£ÈcÌØÙa–�¿F�ÀÄDˆƒC¬¢`lgy¢¿æPRMÚ²Œp ö˜2íEÚl§–8ÖÐiÕ€ ;ff`Pœi ì¹SðUƒ�*Kfü<÷35›ókÍ{ßt¼©Äë,áã‹6:³ó³†žÿ[yqvÁˆ0¾CªÚ³ó—Lq0Ñ'ödÛa·ÇævÛ><¨ä—µÐ÷vÃîNÆ.#3ã»>LÜRúû8Ä[D…S£I¦×þ –jÀDÉ7p(0‘D'Té|H g #”Ÿ1ä?í /Žtaæbe´›jÝ &Jò·P\„}°û”ªuµê½sÝáL^wE7þX w~D[d‰Ö¬,úY“l#�Áf1&[c<òÃ( Âý°ådñŸŠúBé÷À–kû±u¤ªIvÀŽsÚ¾†*MR¼× ÓŒK«…nXyQ'úyˆ’0ÁA¦ÏC”„©2�n`‚ƒLŸ‡( Ód¢ô{€udšqïÒ¥T‚ô¾E&�~Š$L5%�À#Pnùmª(¥ß ¬_ê»Ï«¦ë]6�|VtÑ!Ê/j‰ºÏ/B”_ÔRvŸ_D©|Qµ„ÄúEˆ’0M÷Ié÷ëç>[B�Þ™¤ø%¨òKZ¢£ _‚*¿¤¥< ú%(óKZ¢£ _‚*¿¤¥; ú%(“°O«×((:^Œ)HñËPå—“Uè—¡Ê/§­Ð/C•_NV¡_†*¿œ²B¿ U~¹® E#Ì#‰ ô+%a‚�üW ʯh)7ò_A ùŠ–h#ÿˆò+Zº�üWPA¾¢Õ³‘ß¡z äW¡Ì¯‚b‹ï\J •~Êü*r§Q:wUJú€LS˜LSéW¡LÂ4WÖSúýÀú­¬oæ¶¥ ü4IØ [jÜ\LŸ_ƒ& ÷À–;;MQŸD  Ø ;ιÞúü4Ißv2q}Rúû€JS½ëês;§O™ñú¯C˜_Ã-ÞX¬†H¿a~™Ó(�9Š"%½@¥`LL¤_‡0 l–‚H)ýýÀ~Øýõè-Í{IjUý7 JÂ{K߀* Sí-�½À{K߀* Óì-Qú½@¥ ú^ÍümÃÊÊÌÊš$L°™ÿ&4I˜j3Oº€ 6óß„&¿©¥ÛÌSúû€umæËú”iæ¿a~KK´™ÿ„ù--åfžôlæ¿a2-½fžÒ߬_3ߊô¶§{(HòMè’0Á¥#oB—oj)/y•äM-Ñ¥#oB—ojé.yuäM­žKGvfçï„÷bI�;½m¾¥%z�Â[Ðæ[šâA ª:} D¨äLÄtú´Iß)Jâ:¥ôÁ>»N·eç_pL¹}ÈoC”„ ß¿ Qvi)ß�n`‚Ã÷oC”„ißSú=ÀºßW*’~Êü¶–èðý·¡Ìok)ß�> Ó¾ÿ6”Ißð½ðÙN”|?‡xbz{:œÔ ói«¤ü!¼ôw€x’΀ï„u«Œx$kéêÚÙQýx+AŽßÕÂC·¾ y6iqF:[|‰Z´�¬FÊ€L‹«ã$\HßE%‰p¿le©ú­†Ùl•4£¾‡×ÖdôIßh¡o´àWÚÿµÒß6…?ºý7àGê©pMú!^Þê·ñF‹Ž¹äw$G—tg4g糆ãŽf_]^|pÚyðèôɇÖkËÞð¬Âƒ£§-eÆü¬Ñ¹ÑY¯P×çnÜÓGgçK¦ÿŽ��>™9v2›;‘õëÅhA·Fמ9•F‰¸´—óW. ŸçFʧƒ«$5tˆ]¡Ê¥ÓE»óË̱-ûµm|‚nn¥ë Œ¬éÑ‹ºUk1pãÅ×®M_¯&@ÎA÷Ê#1DE©ý}ø·Íkš�;s—‡O…>ñ›UÜù×ÔÎiËoALk¡RH[ˆY�1S¿ÞlþÃ�ÿðßWI±!z¡›7nϼ˜ñ"eÿêU~¨iubùº—vtfJ¹”›Ws¸W?+µ¾¦æ6ú57gR˜_ó+1û5’Ñ0‡x"Y}Fνb7óªˆ>kg‚Û#ô  2-6»¢Ä+C7¬d¯ÈZ8ó(ùñHÐ�<ßçîôì…*¼6ja4»ßo QœW�€’Žñ¯‘ìàØ;’/J¾�C<©— yè-À°¥²§jªOÜ×ó¦^íHÙM(ŠMZÕ㆓*J~'‡xb*–�K†g8Ó2‚Kèú�àšºà oºÏÙbv°ˆ\�õfá(ìÑ Í3½|µº´E8{,ùB£ä�rˆG²Ð—NÍ®ò(‚ñ(f˾J�ÈÎߘ}ˆÄ2ÄFFFÄO÷æîg«6ø£¬˜’«/TSLÔšoѪöf“RÌ–°œË¸ª7+¨˜­ªt‚TñÈ X«æ}6ª¤Ö‘6Ãn–¡PÚ¼ŠRמo-ú]þàΦœc˜ÍVàa؇cóÛ­ÁEöþÿ]òCná âtxöÕ�u®¯ß>Y&-u7Qž…}V–úš_>¼ûZòŽ€’¿Î!EmGTÀÍ¡ìäBÔ˜Ü ¸2È&Á��–jcÅE¼kRý4ùf­âÂz`÷Ä"dúÅMÀqØã1fL�»�›8½ƒ},ùúCÉçOÒ4¶!"”+Ök@7ÚÂÍ'a#p+ì­ÒÍçjBcS›�ZЇ‹¶ö)‚îÄCÿºåÑ ˆÙ¨×1"Á~ð ì3õ×v4Lx¶T«£&*ÂIñ$M£9a�´íw#‰µAÏmuÑö¡ðÞ“èNW—}¯od™m‘¤ †·hg]ÊÛ€c°Çê/è6áQØrT%%Qòãâ‰éí›î—˪FgCù¿PQ±RlGˆ0åŽ7¦8RPëpëhÄ`°–fk�´ka�n_iÇVUjÌ÷·C„x'É8þÓæ^ɱÜò¸[ÐFz‹ºÇ2¶ãnѦë¤q]°`)×]À)ØS±•â:QǺ…÷,ð9ØÏ%Sx€ÏÃ~^¹ðšÊ�€hõ"W�w`ßQæÓ¦»Lîß5 EoY”§j¾aP$ÕžYÔ=C`»ž#seû.p‰”Ïü3—ý¾p0ÈÜMI×2³ Õ%?põ?§RÝqIÏ—ªÕÆhv+ºV2¥&—’oàP­ÉmV¥C+L[9Ä£˜+3³h_t+h^Â:60YÃÍ8æ¼áV™ôñ*W’Ó�亰޻P°„3°g”_gKا–:wÞhyˆ_}æcfŽn@7rz)ï1“.¥¬ÌÓÛt?º_;±d¬Ò×]ÕÔ³k¢¯ÃmÔŠ1s¯—»ìzÆ>²�Pì2ÝÓãÌ-3gf‚Wò{öff‘ôeæÎ’Á‚öÇõt‡†ËE߉›í F;7hqŒx^.Ú¦ï·IÃÙ`¸yU9¹#tƒ%£5ެèØK¦_)¨®¬ü–è»ô€?áeØ—•ßåZMVx�2²ÿ¡™Ï£ ¨Ö„-˜Ka…7B½ÑozfQô•zñ„×`«�‹w…�)­j!†ôrÁ» Wð>PêÓªž<˜T›Â�t„ñ4mÚú,ÔiÓzÌ‹â‰)Øv?li¸‹Ö´|”Qý*™FßX½RS=cˆR‡j1ÂU:´_§‰C<ª~U/ð.sKÅ¢í`!&ý}^wÉ+:þ·Ì\Îp(ö#ˆJ�ÅHkÓ„·YDyÆç÷Ÿ™/y½‚^,’œ7¼‡†R.:fÁôüÖ âíR\¤› ‹žïêNvBô-�9á3šJxOBiTÊa­2å¬&¢£Õìo×W<‚ äÖâ(–é³lÊZ+*WßΙ�|•êV–-éÎ2sÞ°ü>[¥ K˜´KJð¿íÙ¢™y„Ãk°Õ›¾öÕMµ+Êk9K¨Ö1–*äA$9k!_f—©P‡‹ŽjºIЈÆÌôôô ³J…yÃYQœ~tg3à Æäý�ƒXÛvD³r�Ãça«íðÉ •ŽjžD¶*­ ­šê– dÍVë£FjOiq2Â~Œ’oàP¾ýU¢Ámˆ17®^·=3ƒÑÞÀŸ]ºpív´á!gçóöCFÂ÷õî ¼`øßbnÐ#ó+U‚¢íÑîk=/úFüªõ«°¥Öþ¬x£§ý.Ô¼ßorѳ’•5œQÛïuåüWqG�·]—|x¹~ WŠÐ%|öÓ1V ¿§®›ùjsEÑvéÑt+Å(*B„jA)ý×U›ºìçB‰­�>ùtL cÂØ2µX¦³ˆF‡x’.8nŠ5MýŒ#éñXiŒLYÌpÛ¡pÚ¦£¡CÓZ¢ X0ì’˜Êâ–ñ@RóqLe“§�'aŸŒÍ ՜ʢäF�§`ŸR.¼]å©,¿÷—Y FòDeEŒN¯Â–kRªѦëw®^-#ZõÕä ×»ŒŽC Ñ4¬‡S,£-an/‰Å6àNØê3×Â^‡kªÕ¼N�fÛå—�®ñþ”Ú Õ”Õ2€’oà0¥Xö$r Âú,Ûj¹ÍOR$¿ÖT�ΪæÑèâ0¥èá4 +”d<�¤'b¥ÑCc�ózæ�á÷2´ßÌï58fÖ� ΀!7£ÐU=¹%X»þK™Ö£9|vœ‹aÖYºlyxëx¶tè³æ—Ÿ‡-5#Ö`Sr½À«°Õ{Ã[£É_Ñ*F4®ïÀV_ÔDãžM„Û„£ nÝ3¿€$i/4‰¤#ŒÇ MÎñSöÆ£"Ý›DÓÁº3ozŽî,—gÈ]æ¶ï¬¢ÀY8'Ï�ö¹•¯£ø gçlöo8Ntº¢%B4¡ãÕ\³ äóþ ¸¾šågW}—CÞ{•ÛbtžD^xµçÐ'œ†=[�iÌÛ ~ìŸ$Eë�Ü¥:DDk’Ýl…ݪ^'„åEé··ÃÞ_™`6J�Ô%”Ã¥dËäÊáRÊer åp©>e‚)KARÓ(‡édË„ó©–É4Êaº.e²µ<1/Hë2Jâ²¶bZ½Kå2Jârù?�Í µR¡ôwÛa·+óhö[@¿ñp áa€+È Bµaت§V\"b”Ú�°¥zOb¡ä¶;aw*ÍÆAa��=ÀnØÝÊDÚH#ÞY0¤tò,´AØ[ªÞV?ÍŸt2çs»HýmaÅ< ¥„}°þŠy_$<ûPŠ!‡�°Ôû˜´A�É ¤As -­$ K°j¶Ã–òºbú ä6q€N “JâÝHJp7ìÝÊ<º‘Ñâ×hI¬Ëæóö¼+,âç B›)³<ôeÃçá¾™7]/Xi#Èõyð{^«¬;›Ì7:ºèçDd8 {´þ §äŽÇ`�)—YS´PXCÄã(pöD*Ž�[/VGØDUlb‚þ_‚W°v_]„²f>ek@Z’s3ÛåühÕ_Þ d°Y ú ÀÅ'ˆÇ~à“°ŸT÷ÔSî°ïAŠ ˜#ÆÈ{è„‹ƒç—EµÍmmRôÔëMnœž,$BG�Ç`K�«$.î†É ²ÃÀØÒcÛk~9Z‡¶Ô¹N5²¡Æ¨ù5–ðiØRkNWV¦Á°Åž7D+ñ8<û¼2Ÿ+•�?Ô,`S!B.í7t ·”÷‚�hÿo¦ÃJVTÑ2vÉò §¨;žá:ê!×gW|™Ž¹5›šsâÇßÝBµéÎj~à‰œNÁ€§`?ìþúD”\'ðìÊÅ´™¤&ª¢p8[®SXuPÖv²†cdIÝÔÂ!?ÂeoB•„ñ ÊöÑ*ÞrÍ×Ãu»å�Qá*Näڀð‡•Iž ‹ú’é³#†v°sôåÍ}´�[×%ŽÉ¸…L%<û„2wá³H:”–ÝFÒ·Ó¥1‡¤çÒ¥qI߉•ÆÞ©|žŸùå—o¼ R„U®÷Uô”Jy¥~à0l)Ÿ ÊQrû€#°¥bÓ•ý�`;VÉ¥kphtù¸Üá**,b7 ¼ûº2ËmØ<ë»Ê‚(£ BîXÓ˜”´·ÿâìôÔÜ4››ºpušy†èÁòý¢ÂzQ _Âý°÷×_X/"S^Ô*GH…eŠC¢”þàAØR3j®ñ%dA„Ò®±jªë­÷?…Ô¬–”|‡x’¦ñ2r BùÜ zË—NÍÚy_ G¹"Ä£˜-{¸–hêúí™�Á!vtâiñ (^AF“ìQ¦×Q�ž8¹WAˆP­7ÊÚU…ÜÜì�iq~¯�aì.õ¾H~·—ÝšXgù0#ìƒÝW7–4§'ÃR3=V–§ÖeɆý®Þn�àòXœþ<(FY}Ÿbú™�þGýC¬_ŸÏôKÍ€a|ÍöSUˆÒŒÜ€£?8:æÿãc2Y›KÂè|†§êâfŽIð3ÀÉˆÕ ˆ·49¤a]›bŒÑéàK¨t†PÍ.@À]14uÀŒ0¾.ÀÀj–qÅ¥.(rgÓÅ]çå‚R„¼Xë¼xsRBÚÆÓœ¬É$¹ˆt „–RΤ‡H;Âx2©ÝÏ$ÓÍ \ñQ<ƒ� a;ìöØBö¶*ÝËZhvÖZ]/t/#3Õæ™Ô”CéïãOlYN•¤ïãµ?«h…Ç{)ùñHJô®*�iáù-ÊŸD˺7¼„«|‰h´£×�`¢ Eõ[ÊÊ]oÅ_›Ú}§ÖÂ5%ÉY’ÕkS­µ%”\#pŸV¾•9¶dk̤}Å@Ø»GY3â;Ú(ý^`l¹ø+º¿»Æ$úEÝB/Z�áG Â=°¥f+Ätñh�° ¶ú_ƒø"Ð Ü ;ÎzQC �(?¢ÅÙõèGPA>qö„³@·–Çxé}Š$Ü [jxBL�…" ;`«G±ê$�À=°ã¬�5ÔùQ(’Pm\YM�”~7P©r®«Î-~T/sûùÇ HÂ]°wÕ_œƒ ?†:Ñ(['TÅù1ÔŽ�A˜šäž`1q~ ‚ü˜çüº¸8?†Êñ1³K“݉ü®óŠáÍX9[�ÞÇ¡È�k‰ºÎ�C‘×Rv�‡*?®%ê:?E~\K×u~ª$¬Ÿëô#ÏwÖг7¬ü² ÃO@”ŸÐ�‹¢øl¬5IÜßÕ‡ðl¹­©ëùû–ìüT±hXÙ9Úå#Hñsal©¦QLŸƒ»a«¸%áë‰À^à>Ø L%|ª$Ls*�ÒïöiõšJh_¡Ð)ljæj›çç!Íσc‹&ˆÉôó�æç‘=�ÒÙ£(S"À€ûaKy41™~Ò$쇭 ˆË”Ò?TÛ;öŽô¢cбxŽô P%a‚Žô P%aªŽ”ì&èH¿U¦éH)ý^`])§PGúEHó‹Z¢Žô‹�æµ”)`Àé!MÂ4)¥X?Gº�_Ñ&ÈðK%a‚¸_‚( »´p‰@70ÁÜ/A”„iàRú=ÀºàN?22%O´•ÿ2I˜àî—¡HÂTp‰@'0ÁÜ/C‘„]°c¨�Âê¤ô»�õÀm!uÒ1©2qèW Ê¯h‰Æ¡_�*¿¢¥‡~EC˜`ú¨’0Í8”ÒïÖ/m ÖL?¢}ÅïQü*dùUh¥EV+bý*dùU¨¢Q‹c-¸„D¿ i~ZÙ'«1‰~²ü*d±A‹e~EX¢_…4 ™¦0½RŸ%._ƒ" lâ¿E¦ÚÄ�N`‚Mü× HÂ4›xJ¿X¿&¾)Pç-ºO�ß×!ɯC'-²:“ç×!ɯC�ZWuHÈóë�åס“=²:“ç×!ɯC´Xâay~²$T oÖ•g[Ež2ƒL߀.¿¡%º-äÐå74Åm!ª%=@¥N¬˜F¿]öÁ–‹ýÔ4Jé3 Ò[ÝV ~¢$Lp�é›%aªƒLD ˜à Ó7!JÂ4™(ý`]™äV ~ Š$L0ýI˜jJ:� F ß‚" ÓŒ@)ýn`]YÓ*Á˦‘ÏŠ®&z¢|SKÔ}¾ Q¾©¥ì>ßD©¼©ZBb}¢$LÓ}Rú=Àú¹Ï–P 7Â+T)¾U¾¥%: úTù––ò(è[Pæ[Z¢£ oA•oi鎂¾eöiõ…BgÃûG)¾ U¾�¬B߆*ßN[¡oC•o'«Ð·¡Ê·SVèÛPåÛuU(ù`IT ß†( lä¿ Q~[K¹‘ÿ6jÈ·µDùoC”ßÖÒmä¿� òm­ž�üŽìü­’í3YÃòèG�æw Ìïh‰îUù”ù-å½*D È´Äöª|Ê$Ls…=¥ß¬ß ûæì< 4ÉLÇš$ì„çvöúü.4I¸v ÛÙÅõIº€JûÙÅôù]h’0¾s¿ÄõIéï*Mõ®«Ïíœ>eÆë¿a~ [´xc±"ý„ù=dN£tæ(Š”ô•‚11‘~Â$d°Y "¥ô÷ûa÷×£·4kì%©Õõ¿ U&Ø[úm¨’0ÕÞØ L°·ôÛP%aš½%J¿¨TAß«™¿mXY™YùïC“„ 6ó߇& Smæ‰@0ÁfþûÐä÷µt›yJ°®Í|YŸ2Íü Ìh‰6ó?€0 ¥ÜÌ�^`‚Íü LB¦¥×ÌSúû�õkæÛB‘ÞŽn$ùtI˜àÒ‘w Ëw´”—޼ƒJòŽ–èÒ‘w Ëw´t—޼ƒ:òŽVÏ¥#;³ów¬7”Æ�Þ…6ßÕ=Pá]hó]Mñ@U�¾‹"Tr&b:}Ú$<[ý²oq�Rú�‡`Š]§Û²ó/8¦Ü~äB”„ ßÿ¢$ìÒR¾'ÝÀ‡ïQ¦9|Oé÷ë:|_¨LHú#(óGZ¢Ã÷?‚2¤¥<|Oú€LKløþGP&a|Ã÷Âg´^[~ð†g=õh)3æÿ³`�Î�Îz…â¸>wãž>:;_2ýÿp|ìôÉ̱“Ù܉̨_'F º5Z¹w$*…qh%çÿ®\ >¿�;CÙ¯�ÒÐ!v…*•Ï0Ëæ—™c?ZökÙøËÚ̲=fdM�>XÔ­Z»N/Þ¸vmúz5áq­»6TÁHQjþmóšêÎÜåáSá‡OüfwþÃÆ5µrÚòÃ/ÓZ¨ÎbdÌÔ¯7›ÿpçÿ¸²J‚ Ñ áêíH‘Á¿z•jZ�˜UÿR.Ÿ~X.çæÕ,îÕ�ÅJ•¯©³�~�Í™4£Tó+1{4Ò0‡x"a}NαŽb7ó†î¡ì³v¦D+ô ‚3-6»ª$Ä+D8ŽÂUæ-œ}”ü‡x$hHŸÖywzöBfµ°CHØ»]†Y�>™¥ªõÉ6¢,ñJ„I— %¿‹C<ïƒr!O½¸¶TUMõ‰ûzÞÔÝénî‚-—#JCÉïæOLÓW)6�ÉÛ®1Èt–)÷ÉnFù†}8ƲòL/_­mFù�}$ù²¢ä8Ä#YV �K§æ0Ó(‚ñ(f˾2±‘‘‘Aaz�(),õ ì=1ª¥äê ÕÔ5ã[´qbÒjÙ–qñHªå U:�Ÿæ�¼xµjgéE�Y4Ò´Òg¦U˨†)&Á§Ø »56—L£+Æð$ø=< ûlŒ‘Let}ÛêžÑ®Iõ žˆönàl)/Zõ—Û€“°'•+þVf{ÏÓ�sÀ˰/+ÓiÓ]æ^ɱ޵ ©æP’¶ÁnSw�ý)PIÍÉ“õÇa�'£î¦IÙeDvðìC±hš~±x ö±³£ÆTR3¾Hxöqõ6tD"_ŸæOloozF¡FÍ�*É Ø'’� (ù“âIšÆ6ä@„òñÔz‘ÃF?Æ$FØÜ {«tà°šÐápU\Qwüž½g8®oº®ïtm‹y6óÿ¶hg]ÎÛ€Ga­¿¢£anÂqØR^UMJ„Ç8ÄÓÛ7Ý×�…``­Z‡+^»UYÆJYЊ:¡Z·`³*жp(߇¬qú>×—¬ ÔìAÒ—�»`K�ш5~Û¡ÂݰåÆdøO·"ls™`Ñw:€½°{c+¢Ms³w¦e æp¶t /V0}ÀA؃ÊÓ2ÄLkÉtÍùüòˆhý¡ï< <[*T¨1ȱ¤çKÕ²"ŠÝwh©z3J¾�C5o¦<ÈÑ®…Ž5B<й25·hº,>u™p¨C,ëû7ÝɺLÏçÝjZ ì¡í<bº•e9Ç0\Ñ×à& ´)ØSʯqÀ1\»ädü—0FF†ü¦`;ËC̵3 ÏV?7p^m“[R*äœtŒ•A[Ÿ…:mräÓâ‰Éwl»Ÿ5ÜŒcr÷Þ¬©+”Q�*™FßX½ŽB=cˆR‡j^¥V�£å²næKŽÁ ~k#:ŠEÚMÀØÒ}�VÕÃÝeÄ“tEì‚ "L©U⮽ˆ‘Æô{¨;ùw¿90]·vtg^_ V!ŸÇ¢Ì‡‹†µb¢�-ê.›7 KôU¸³Bÿ°A“ô+^¥Ë1‚åYöÐô»±%�eüæ‹ÞL�·ö¬ÚÆ�t»DЇaK­å‹R÷Ay„#°G”‹L|Ÿ¥? ƒ=¦ÌcpÞW‹DºE ¹æ æ.-óÒKž]Ð=“´$I÷@>„ƒ°ÕƒûSS#©{~M5ªÔ_³P0²¦îùå°ÖJV„^0&<ûÔû¥"©óÀ«°¯Ö¿"Pr§�×`_S.ÑFò¹º°#%×�s°ç”ÉìÖóŽ¡g—ƒn@X.�š®�Ž3iæOL~÷š™cŽñFÉtŒëzÁp‹zÆ蟽}ëªéýCÌÿÄðü¦c’Ñ0Úà`OMùí`Ñ1-oàCì3é…bÞpgr¢ïvH«Ì(¾ûÅØ4¿õ~Ö¶cb‚§ô÷qˆ'¶,ˆ §†+EÐ�fCGÉ7p(ßБD'TéЀ~‡xs¥oõ‘+üVNñ3WžBqrѤBµ®z�úâ/Ú«ÓìÓÖFãêž5É6™¶æ0ºzu€¸�IÕ/Jl$€ÒïV¹{@bár�c³§Š4"sÜ0Ä@Ø¥­96»^†«›-[Bâ]t"°XåØìz)tª$ä`W(¥ß ìÓÖé“BÛW(Tæ¸HsD«zhT½d:iŽhU�JN¦D€÷kkN=­—LG MÂ~Øý)È”Ò?<û`=éEÇÐåNÓ…* t¤£P%aªŽ”ìÕ*#ß 9ÒQ¨’0MGJé÷ëêH9…Ê8Ò1HsLKÔ‘ŽAšcZÊŽ”0`‚Žt Ò$LÓ‘Rú€õs¤M•S ùÕ*Kt;`KMï‹Éó($IØ [}°]BžD`°K+¯+¨·<�B’„Ü$~âò¤ô÷•‘÷:¥rú‘‘)y¢ê×*+¹«œRY/uŽC‘ãZÕS*“Sç8ªÇ¸Võ”Êz©sŠ×T;¨©sµc\«z¼\|Qèô#Óõ\™(”_äŸ`z ª<¦¥…CÑ&…ƒ* ÓŒB)ý^`ý¢ÐÖàÕéGtF–ø6Úã�åqh¥EV+b=Y‡*µ8&$$zÒ<®U½ ª^=Yתž˜D�Cš„L[sž}|M¼/Ñ+g Ò{Š$L°‰Š$Lµ‰'�À›ø§¡HÂ4›xJ¿X¿&¾)P§Ì-‚' ÉZ¢ý£�ä -åþÑ Èò„–hÿè$yBK·t²$¬_ÿ¨­"O™!¦“ÐåI­êmõÒèIèò¤Võ‚¶ä4Jz€½Úš‹uê¥Ñ“Ð%al¹ØOM£”>*�°Õí˜ôS%a•cÒë%ÐS%a—¶æ˜ôäJº�J�œ˜@¹åÙÕÎÎML ”~P©~¾W:ãÞ¥UÀ‚ôNC‘„ F §¡HÂT#P"Ð L0= E¦�RúÝÀúE ¾û¼jºÞeÓÈgE×M@”Z¢îs¢œÐRvŸ(• ÕèDI˜¦û¤ô{€õsŸ-¡@oG€‰*ô TyFKtô TyFKyô ”yFKtô TyFKwô ”IاÕk �5ÜR^X¡g¡Ê³É*ô,Ty6m…ž…*Ï&«Ð³PåÙ”zª<[W…¢‘æ‘D: Q&ØÈOB”“ZÊ�ü$jȤ–h#? QNjé6ò“¨ “Z=ùÙù[Jw¬Ÿƒ2ÏiU/®—JÏA™ç´ª—'§R"ÐdšÂdŠ˜JÏA™„i®¯§ôû�õ[_ßœ�§�&™éøóÐ$a'l©qs1}ž‡& ÷hå“À“×'èvÃŽs®·†>ÏC“„ñm*×'¥¿¨4Õû^ך–õ)3^ÿ „ùŒVõZÓz‰ôó­êµ¦É‰”ô•‚11‘>a2Ø,‘Rúû�ýÚškMãë-Í{IjmýTI˜`oi ª$Lµ·Döì-MA•„iö–(ý^ R}¯fþ¶aeefå/@“„ 6ó IÂT›y"ÐL°™¿M^ÐÒmæ)ý}Àº6óe}Ê4ó!Ì‹Z¢ÍüEó¢–r3Oz� 6ó!LB¦¥×ÌSúû�õkæÛB‘ÞötÏ ÁI^‚. \:r º¼¤¥¼tä*É%-Ñ¥#— ËKZºKG.¡Ž\Òê¹tdgvþŽõ†Ò¸Ó4´9­%zœÂ4´9­)§ ªÓi¡’3Ó)wgŒÇ‹ë”Ò?<ûPì:Ý–�Á1åv#_†( ¾¿ Qvi)ß�n`‚Ã÷—!JÂ4‡ï)ý`]‡ï+• I¯@™W´D‡ï¯@™W´”‡ï‰@�i‰ ß_�2 ã¾>ቒïçOLoOGKzÞµ«¤ü$^úY ž¤3àÙ°n•�d-]];;ªr%ÈqF �Þš�<›´8#�-¾D-ÚFV#å @¦ÅÕq.¤T’÷ËV–ªßjˆ._‘fôÏsxmMFŸô�ÕWÐßZéo›ÂÝþð#õT¸&ý/oõÛX£EÇ\ò;’£Kº3š³óYÃqG³¯�./>8íO^Ç¥gAŠ›Q*„û`„<ÓËW«7›Q*„UæU“*!J¾—C<’%Ôð¸tjö†Ÿ@D¸êJLÉlaåúK'w[C¡R¨mb###âGy7¢Ä0øºº_¢¬š’«/TSMÔvoѪvZ“RÍ–°¬Ë¸ªÓ*¨š­ªt‚�RñÈ‹¸ê•e›H:‚Ìš ‘¦•¶83­Ú� SL‚O °vkl¹Ýu'&V 9Hð{ xöÙƒ˜u. ß5©~Â6ÑÞ €= KÍ/·'aO*Wü­ÌöV �-�sÀ˰/+ÓiÓ]ÜÓv¥I5‡’ ° ¶T¼îAìÍ•‹+j�õ®G0ºfaöx2ênš,Ó– ½O«\†²O[1Ï¥ iúÅà1ØÇbÌŽ#ßÍø"áqØÇÕÛЉ|}šC<±½}�Ë蛸Jrö‰ä#Jþ$‡x’¦± 9¡|<µ^ä°Õ•\ CØlÓúôUiõë,³¨;zÆ3?"vèæ=?Æñt3¸§ïö­«¢š&l×*§¶kñÖ蚎· ¹#Î’!t˜t�V£ÑŠˆ°>šÞè÷›‰q ‡úBŒI͇Ã[]о  †¯h×7]7¼%Ö³™ÿ·E;ëÊpÞ< ûhýÍ…/üɧIK‰’?Æ!ž˜Þ¾é¾î,#ÄÕ†°¶âµ·+ËX) ¶£D¨ÖÕ}ì;÷jÑ¡Á¼-Ê��Ôˆm£q’Z±mÍ!‘öðõÜ[jÈQ,šk‡4Úµª—ªIʤ�éù‡úrÔq™.ZPÄe'ð ìƒÊ¼ÝŒž×Q2(k Ô0t¥Hf‹åW^Ç̈²Ù»´Ê@–úßSÞ¢î1·hdh1§ËüÖ€ùçý6ÁÎ1Ç~èb.'uGìn�$änûRÕ˜ßÃ%’åàPøzØpéPÕ~ÕTŸ¸¿¤çKÕê\4£]I›’k¦ä8TsÍ;UéÐËVñ(æÊ98d_½¥0ÝÊ–]Ó:BVTJ“ðìsï‹æ…Û{—dóÂôcórÈïgü"¥ kýrÍ9½”÷˜I·C–gÌEË®;q€'a«w©Ç.š™Eæ.Ú¥|–=´�!í‚ízl^Ï<0¬¬;ÈïK÷·»¢¼¹][бîzÃv;VmJ¼£q¯>à(ìѸÎàÝöIµ5ÜN¯j»¾†ð¸�2üõ>õ®•ܲjþÚÕàjˆ|©Å$rwx ö©Øõ»38�wÖ÷îSpîR ~ øöƒdÜ>¹†¾ùià]ØwcÓðy`v> Ÿ`”5¼}ˆ–[ ÆòÈ%‹:cbc? ûÃʬz)Fq‚CÒ˜éF}«œcHÍópË%ªÝbS…kËÎ_̺ží&\Ùˆ\tÞ ì™d*[ëä êÄŸÒ*§ã>¥Iº³ª¿|øìçê_Ñ(¹>àó°ŸW–tƒplMé_^ƒ}M™GÿeÛ F:©Æ¿Aû¹!Ð!æ†hõâªTµkêbª^[²óLK¼ëÕ*‡6Ÿ‡}>™zÕ8r–`< |¶ôDßš_Ô*× †Xï EÉÐ*ÇqQ½å2-Ò®gfJc\Äæðì[ʬž¤–«Îÿ?¿ÇV n·ô`iEs.o?ì÷kX°^DØô¡jF{‘žTæ+Óè«÷æ¨g Qjà�¤÷Þ¦J‡|C‡xåµã%»Ä2ºÅho+¹ÂmÜAd9¡Úúè¸Ç¹B^Q†{4ÉÖW̧Ô*S`P.§}4óJƒBÁà¥íøá~ѱ3F¶ä¢J:È=ç+¨Èp6·*NÎv n°”œùnÞ,úMPàäýèÊ&–õÀÍ»á@¶v…C°þË¡oãâƒø‡ ?ÂYسÊïuzÎFKeTÉûð%Ês[}á•€‡A™ð4ìÓÊôÏúÙ®W)�0À ØU¿Ú+ˆ¾Á°&äΆV|ƒ-n)³Èt— ²BµÉ±jž©gæúíéÙ96s}î­|g³Óswf¯Ï\¿ÂÖYÏQcs Ql>[jZ¬†«Z2œùÉnÁVßöÄ�L;B†µòJÎÀ�½¯´­r—p‰˜]¾û…dúKÍ“ÒWÜÛóÀØÒ£'k~ù4ðEØ/Ö¿}¥äŽ_‚ý’²h›ü.“ëºøDñ¸ÌÀÎÄ– [üøÙÓÍ|µu=Ñ™=ƒZœáÀ”’oàP-N¦ÿºZÍÝ5³bJ�‚áSø©sØì�Ý#Ã4`¸I5ãˆãOÒåǭÈQF3·KóÁÆÃ�f¸F¬hú€ƒ°¥úQ+;tÂ—Òøl9‡+å4.„Å`ŠNãÂ*Œ×il5 #kÖ>¡oÝ›¥Z€»a﮿8)¹èf­ØRã˜qù "Ò©UÖ½ujqƒHù ¢2|J+/H¢hú�C°Õ—ˆû J8{$¶×ßø óƒë]Ý,•Rg�’oàOÒ4.!"Œ'7žœ£Ù½B‰ö9Ñ,_–ÖôÐY¸ÙJ'Rx䌿Ã&¾µ¿“· #êûoó}y‰²ëw€†™ùàX”EÃtXpÖ¤ð+\mB®œtÉó×X$;øÍ>Ô¸?"© x�û#’¢1ƒˆ°Nó’+„-H‘¶5ßó’D£‹CÍÀ�°¥f´Ä| %·¸ ö.å‚9V‰ÃÝR±h;žË²¦ëù‘xÉt) Ÿ7¼‡†a±þ¬éøMv¿¨¢ˆðnàØê NÐiýEÇð{ F¶ŸMÝœq™�ËNxªMA·–+wesÉïK‡b/@w„'`ŸPæ¾å&ú:‚l^Âøw'n/×6ÉæfïL‹V ¢Õì…Ý[ÿŠAÉmöÁ–‹9øO±¼¡g],3‰ò¥rúD¸€CTND‘/Á¾¤LõJØe¶þb¥%SG£Qk©‚°3Uó°–Ð7º1(\7^‚_ÒV +¾Ì6j)¢#Ý Bîn�˜ê‡ÔQÙ ì€-5ì)V'(¹`'lõµðÇXÁУMø$¬±Š6kemÛw¶ý� ÚfàKNTTDxð9ØR§T­ ~± ?À¡ÄÁÁ™®a¹F¹�µCÁÁ®TG#o,é–7È<§‹¾ÈËÐa4MxQùE.„§!P]Æÿœéø/¤{~½/z, 8°)¿–g2†ëæJyš²ý÷ÂWDßã>¸^€}Aù=&¡˜èT::Å¡àóÕp:‚[ZX0\¯2,è‡9äËD_áÐ&T›,‹7�|U —5¶iñßZÃ7¼Š,xµüÄ1 Û\$…"²¸ö^eBû§é´ý7œw-Ú¾Œæó¾Ë2õ%Óv\ᥖ¯!¯÷Ö_¢¼ÔòZØÈE¨vížVSE5VMéÈÂøVMuKb£fa@„ æŽÎa/l©X´>¡2Ñ:<ûxý«>%×|¶ú9Û|ÿ펥çóË¢*&&'€S°§¤ËIù‚�yT¤®TT¤L¬•ê´„]::Ü.yü5=ftSϾãÿG oÍpxö¹är/‹ËÆš{Wä^õ¬ͨ,‡ƒ°¥3ªUUõ”aªϡ¬r±–›ðÜÜ*ÄS“!¹jŸ~¶Ø®%¶jŸþÃF`|«ö�{½Ì%ÚðCÿ׃“È+Ã+ùåò�zd¢B¦„w/ÁV_™˜72:Oeçh+}¸îƒe|¡ZÑ%:Ž¢ü ~BµýõU/aࣖËSWo ‡-‹�a'l©a15."+£Ã?÷(k' þ>ÉÑ­t?…W!©.à(ìÑ䜧‰ü LÑyš«ð}á<‰L 0Açi¢fÆç¾†xMŸƒ-5(^xÇ�ÏÃV?¯^8$£ä¯rˆ'¦·oºo·Ç•­Ö„ƒäF^¦4MÉ7pˆ'‘,˜Çk?H7 àµ#”ι¶%�7'|Žñä9ŒŒG݃¯CÀ§aÇyÇx FÉõOÀ>¡\j*ƒ<Ää$ðì ÒµUµV´°‹aÂÝ] 5ÉŠµVy¼AѼ²8‚-ºÆÕ¢³Q\&\tEW1Ö¢ÛÏÜàîÁ°üb‡+rxöáäré ä̱æÒYÖ•¡çû‘CÑ!ß®áyá9wÛÊ™ Áa›¶åN„¢Â'³½Áál¹QiþÓö5ãL�—ƒÜ$l‡-Õ¡©Ï¬ÑêÀNàJn'p¶Üh*ÿiLÃDêIà3°ŸI(е!WK5Š¥ä8L8Šõðæ„ïïi�ÃAMuZ YµÜJZØÀF˜pc»„²Zе܄G¶–Váûbd‹È´ÛµÄF¶(¹F`|#[Gøi�‡º´åÁ¢�J¥¢åŒ· 8[m0=ö=€Dí6ð5دÅXŒuÙHd¯o¾)KzÍ/O?ûɨú P‡­'ßLRòóâIÊÝ> Å`Šîöá*|_¸["ÓLÐÝRr�ÀøÜmw͉Qů]ÀaØÃ Ŷ%Hô‘–jlKÉ7p(ÛJdA¯½œn,ãµ#L2 >€×þ`ºYðA¼v„ò=%BD(�US]oÇö,Rû­tËá·�÷¦TFD(ŸBûlk6_ÑÂ]Š≩M½fæØ€c¼Q2㺯»E=c ôÏÞ¾uÕ5ú‡üvÆ4¼ü2•ƒóTɳ‹Žiybü(\«=“}·�â}_„ß�b[ïgmËsí‡5’Þ| öKõSÛºYp�C<Š<Æ2¶ÅγìüÅðNŽ”èÄDˆƒC¬¢`lgy¢¿æÀXMÚC–ŽÁK!û>Ž´#ŒÇw fç_pü\šÓçóÆ€Ÿ—~fetÇõëâ¡gÈbÇÅóíàH8[}¸s$;?ëóZCw�1¿~Ò®##8¾úsì‡5¶Õ$ýI%�=¢Lš;�]˜Ñ§À‚°¶œSä?md4Qs¡&›Oƒa#ìFe6SŒõówŽR‰²·hÙ¡`›÷ »;uõÎôm6ptˆõ+ôÀø'´&‘Ï"qÂØê¡ÀøcÖË~ÈNÈÕ”Ï�,á8ìñÜâç‘v„ñ¸Å�Œ6¿³%=_2\¬\£y± c^ÞCVsè¼&Ý/€"!w‹oŠæ‹`A˜¾ƒùÆç`ÆßÁœbçûʼnd¿k}èf¡â\?*Íû<ŽOœbOOœ÷4_)ÂnØÝi¸¼¯"qÂø\Þ1—wtLÎç} l ¹;æ÷y_GÚÆãóÚ³ó—L7ÛQŠí7@†°v{l=¸¶*õÁ¾©…Ͳ5@¼öMdá^Øê{‡Å•CéïãOlYN�Þ=½ö·b­ð %ßÀ!I‰>§JçM-<}.B<йÒrÙv‚qsÓp…ox …CØ»E©W��ÌÎß6¬¬Ü}õDmxvœû’×™�Ü6É— Ý <û�,í5¿¼ ø4ìÖðRr­À°O(«wspÀ‰DÞžž�-wJßzªÝ–�¿bxò¢½üì$#ÚæÉ o ÖÏgaÏÆ¦Ù @¶Ô|¶¸fÏçaÏ«ÇÁÂljPú`¶ÔÁÊj ÐÛ¡ÊËO³Üw#8èÒ…™‹å›’£›ùüI”ä·AŒ°v_ì•{ç ºÃ™¼îŠ^ú-l3¿¢-²D߳ޝI¶È`³úW¥ï (÷ÃÞ¯^•„×ASúýÀ°HË£¡vÄ2U,úMÐǤø]ˆ�° vWý…ñ]ˆ�°v �~ñKF‰À^à>Øñu¤I˜¦#¥ôëçH›²ó—tOŸ[.ŠzÑ@’„°;ê/Ï@’„Jó¨Ê“ìvÁ޳©!Ï@’„1ÎÁ Ë“Òß TjDÖ•ç6~BI�á;å;(œMò,%1�¾Q¾]4ÊêBU ï@!ï tº5É #1�¾Q¾al�†š@)ý`/l©æó½ÑéG¦ë¹2�è»På»Z¢�è»På»ZÊ�è»Pæ»Z¢�è»På»Zº�è»P&aýÑÖ`Ü~úQÆ(J\fúCÈò‡ÐJ‹¬VÄ$úCÈò‡PE£Çd·„DiþZÙ'«1‰þ²ü!d±A“u^jý!¤IÈ`³Ø%º5�茕³éýŠ$Ü {wýÕù#(’°¶T諪N"Ð Ü;Χ†:EvÁŽ!ÄV'¥ß TŠpÞ«‹$9ñùcHòÇZ¢]¤C’?ÖRî"ý²ü±–héÇ�ä�µt»H?†, ë×Ej«ÈSf”é'ÐåO@°E¶‰iô'ÐåO�7�Òy£¨Q"ÐTê&ˆiô'Ð%al¹ØOM£”>* ²½W7~Æ¥µµ7¬¼¨ýˆ’0Ánüï@”„©vã‰@70Ánüï@”„ivã)ý`ýºñ[I wõ¼)zDÈO¡HÂ#ПB‘„©F D ˜`úS(’0Í”ÒïÖ/õÝçUÓõ.›F>+ºœègåÏ´DÝçÏ ÊŸi)»ÏŸ¡T~¦ZBbýDI˜¦û¤ô{€u%�Þ˜§‹.Dús¨òçZ¢£ ?‡*®¥< ús(óçZ¢£ ?‡*®¥; ús(“°O«×((:ÜÂ(ªÐ_@•¿HV¡¿€*‘¶BUþ"Y…þªüEÊ ýTù‹º*�|0�$*Ð_B”„ 6ò¿„(©¥ÜÈÿ5ä—Z¢�ü/!Ê_jé6ò¿Dù¥VÏF~GvþVÉöŒ™¬ayfÎ4Aš¿‚2Š-Z¼s)5Tú+(óWÈ�FéÜQT)è2Ma2EL¥¿‚2 Ó\bOé÷ë·Ä¾™ÛÄ-Hðw¡IB¥«ÄÅôù»Ð$áØêw~Iè“t»aÇ9×[CŸ¿ MÆ·±Y\Ÿ”þ> ÒTïºúÜÎéSf¼þ÷ ÌßÃ-ÞX¬†HÂü=dN£tæ(Š”ô•‚11‘þ„IÈ`³DJéïöÃî¯GoiÖ(ØKRËëª$L°·ôûP%aª½%"°˜`oé÷¡JÂ4{K”~/P©‚¾W3/»…þ I›ù?€& Smæ‰@0Áfþ É?ÐÒmæ)ý}Àº6óe}Ê4óaþ¡–h3ÿ‡æj)7óD ˜`3ÿ‡&!ÓÒkæ)ýýÀú5óm¡Ho{ºgÐYt‚$ÿº$LpéÈA—¤¥¼tä�PIþHKtéÈA—¤¥»tä�PGþH«çÒ‘�Ùù;ÖJãN mþ±–è‰  mþ±¦x¢‚ªNÿD¨äLÄtúÇÐ&áØrã=j:¥ôÁ–:2齆ï+§ 2üG%a‚Ã÷ÿ¢$ìÒR¾'ÝÀ‡ïÿDI˜æð=¥ß¬ëð}E 2!éŸ@™¢%:|ÿ'PæŸh)ß�> Ó¾ÿ(“0¾á{áCž(ù~ñ$Mã#"Ä£Hã@xÖTÆ.èܸ𖠵ó¦þ�#TkýÖ«ÔOHÝköO´°ö¶kñ_òT£&Sr�Àø.y’¨ÉD`p7ì8mÖ¨Éÿ2 ì€Ý‘B{Céw•Öl¾ç-yCwÂ%7‚ÿ)TI˜àò?…* SC&{� Ž!ÿS¨’0Í1dJ¿اÕk yG°sfÖ~èNårFÆ3DýèŸB™ª%ý)”ù§ZÊÑŸ¢x™–XDô§P&aš (ý~`ý4(ÒýtI˜à ÝŸA—„©Ò�`‚ƒt]þ™ç �p¸LÉ3ñÄôötOž¡ç]»JÊoâ¥ÿ™g .œÿ,¬YeÄ#YGW×ÍŽê§Ó rüçZxhû?‡VšdµR£�2¶E‡?ÔHy�Á–’‡Z!Qòû9ÄS!u×îÖ òü(°¥¾pAý áAØr‡�)%ˆC«ª\ÐÍ«iÜ«�•*_Sgý:›3iþ¤æWböh¤¤añDÊú’œc;Änæ Ý5BÝgíLp×›4>¦ÅfW…x•hiÂ1ØcÊÄ…ó�’?Ê! ò§«Ý�ž½P…ÚF-ìvVn||j5"K/T‹ü7¢0wÁÞ•|ÁPò»9Äó~(òÖ[€»`KåPÕTŸ¸¯çMÝ­‘îànØrY¢T2”|‡xb*™�—lÃe:ó¨`ü�×/¤ó‚7£L»awÇX>žéå«ÕœÍ(Â*+“*J~‡«.8,Ÿ†Ç¥Ssã A„x³¥oE ¦»ú¬!F.mˆ�ŒŒˆßÛÇÝ´YmÀCY4%W_¨&š¨ߢ­“Í–°¨Ë¸jœAP4[UéÐgÛ8Ä#¯a­š¯ÙDªdÖ�4­´Å™ŒžX=@8Å$ø´[a·Ææ�Ûý˜wbbÅ(‘¿§€gaŸ�1ŠYçʯ]“ê·íÝÀزô×ürpö¤rÅßÊìà áÉ¢qxöee:mºËÃ+9Vد$Å]ÆäφÄ]c/T"|¡]3dA8{<u7M–iK�Þ<ûP,š¦_ìƒ},Æì¨1YÑŒ/‡}\½ ‘È×§9ÄÛÛ›žQ¨Qs£Jrö‰ä#Jþ$‡x’¦± 9¡|<µnäPé-ìoGˆG1WNÏ"æñ•íiÇ�|õPSI›ª”ÄÄP�„§aKù'µ\Ü�¤#ŒG[Úú,Ôi÷k¡3‹OLUqÛ}ß™d³XY>½Fz”QÑ1[R™FßX½CX=cˆR‡j•”þ못±.ëf¾ä¬à·‚¢+´i;y°¶To% Ö¢šcD£‹C¥•ä˜<‡êz€§Q9Ÿ�ýLý�%7œ‚=¥\€-~1Ÿ§óõüÊ&*i¢rxöueJ[IJ¾l„½× Èšp+ì­Êtv gQ/º4W�l ; 2„Ü‚ó˜ô¼m/:<‡ç› j¢°Â‰g7pv+M)¹]À3ZyÅiÒ%–C镦rŽúBŸ£ÞGŽšæ¶Ân+³sò[Nq¸_+O9)ȹž#DÄrxvB›Óc!"Þ#À °/Èò_óËÀW`¿RÿjNÉõ_…ýª²À»'ü0’l'ÜÆ@^Ú�г¶%ܪ¯×€�`?Š-[Ö[i~<¬åIŽ”º�”|‡x’¦1�ˆ0žÜèºL3Qä÷ÂÅ$y?”:é (vÁ–vX÷txÁ«>Í ^u… ·28™ãTˆI8Àí¡¬�— ~ø4lé³|Öü2>ûùúû>J.ZœzöUeM7/î£ô¯¯Ã–‹ÜëÑÃ"Vw€ØqNê¬S87€YØR3&«Î‚‹V\K”‘,À.ÄVFR뫉Š|ûa2cÁ–j‘WÖá©JøAØL¾a<g“›ªEj“ª)«e%ßÀaJÊ9ä@„jS5�½‹¦fí<¯…#Úâ‰Éa\3slÀ1Þ(™Žq�†h‹zÆ蟽}ëªÑöùa·ixùe6Éȵ «¦Jž]tLËø;ÀŒGz¡è‡39Ñw{ïCø"ìcÓüÖû~GÁs£Ûl×$½øì—ê§¶u³à‡xyŒel‹�f•Ó7Q¢! ±þ‰‚áw­–'úÅ�tžB–ŽÁK!û. íãñ]{×€íç–阮DN]+ÂøN.gü�Í<Á!F Nó¨2Øì}•‘Ó`5kFŠKî2ÒŽ0ɵgç/™.–,RF‰g7ÆŸ�WøÿáA%_ÿ¬úwÂnØRg‡‰ûúg‘Ϧ¬J‡Ò·ÔÈ‚¨pjDôÚ3±ŠV8¸¢ä8”�ñH¢ªthउCùÙ[þÓ¾p{õûÿÄo ÅEØ»O©Z×’R<Ï�†>Z€}°¥ˆÖèGÖ¸N”’k2جþÝ׫( ÂøVø‰ŸÉHé÷hknš_ZVëRŸ©bѰ²ë^êSƒâ5ˆ�°K[scw½„q b ä¶û«–�øÈØ ¬rcw½z ª$ì�Ý“‚B)ý^`Ÿ¶æÆî˜Ú¾B¡SŽ…�Íó:¤y[´××K¦×!ÍëÈžFéìQ”)`Àý°¥<š˜L¯Cš„ý°ûS�)¥xöÁz8Ò‹Ž¡£ç&HñTI˜ #½U¦êH‰À^`‚ŽôTI˜¦#¥ô{�uu¤œBeéMHó¦–¨#½ iÞÔRv¤D€t¤7!MÂ4)¥X?GÚ”�¿¤{úÜrQÔ‹Þ‚$ ;`wÔ_ž· IBî|¹äåIö»`ÇÙŠÔ�ç-H’�;+qyRú{�J�ȺòÜÆ�ç 2œ…(gQ8-šäþ^1�ÎB”³ÐE£¬.T:«UN¶Ú ;�3›f!ÊYmÅ8‰ ”Òïö–j>×èÖòµî‚ônC‘„»aÇyr^ uÞ†" ;`KymUu�NàØqÖÎê¼ EvÁŽ¡v «“Òï*UÎuÕÙš�¿bxÓ�2FQb/ãd9~-Zœs 5%:YÎ!k¥³FQ¢D`°¶T‡EL¢s�%a/l9Ç¥&QJ¿È`³z8P_¢3VΤwŠ$LÐ�Þ�" Su D ˜ ½E¦é@)ýn`ýhS Î[%ÃYäw’¼«%Ú=º IÞÕRîÝ…,ïj‰v�îB’wµt»Gw!KÂúu�Ú*ò”azº|[dë�˜F_€._@Þ4Jç�¢F‰@P©‹ ¦Ñ KÂ>Ø})h”Òg@¥¶÷êÂϸ³†ž½aåE�è‹%a‚]ø!JÂT»ðD ˜`þEˆ’0Í.<¥ß¬k~ƽKgÝ Ò{ Š$L0} Š$L5%�À#З HÂ4#PJ¿X¿t[¸Eì²iä³¢K‰îA”÷´DÝç=ˆòž–²û¼‡R¹§ZBb½Q¦é>)ý`ýÜgK(ÐáI4‚_†*_Ö�Šª|YKy*þe(óe-Ñ©ø—¡Ê—µt§â_†2 û´zMÅC¡³á¡„‚ïC•÷“Uè}¨ò~Ú ½UÞOV¡÷¡Êû)+ô>Ty¿® ݦ°üˆ’0ÁFþˆò-åFþÔ�W´DùW ÊW´tùWPA^ÑêÙÈïP=©åU(óUPlÑâ�K©¡ÒW¡ÌW‘;�Ò¹£¨R"ÐdšÂdŠ˜J_…2 Ó\^Oé÷ë·¼¾9;OM2kB_ƒ& ;aK�›‹éó5h’plõ3è%ôIº€Ý°ãœë­¡Ï× IÂøö”‰ë“ÒßTšê]WŸÛ9}ÊŒ×Âü¶hñÆb5DúóÈœFéÌQ)è*cb"ý„IÈ`³DJéïöÃî¯GoiÖ(ØKRKëu¨’0ÁÞ’U¦Ú["{� ö–t¨’0ÍÞ¥ß Tª ïÕÌß6¬¬Ì¬ü<4I˜`3?M¦ÚÌ�.`‚Íü<49¯¥ÛÌSúû€umæËú”iæ3fFK´™Ï@˜-åfžôlæ3&!ÓÒkæ)ýýÀú5óm¡Ho{ºgÐ9ù‚$³Ð%a‚KG²ÐeVKyéH•$«%ºt$ ]fµt—ŽdQG²Z=—ŽìÌÎß Ï—w2 MCKô4Ú44ÅÓTuj €•œ‰˜N h“0º4Tn¼GM§”þAà!؇b×é6þ)A†9ˆ’0ÁáûDIØ¥¥8|O?Õ Lpø>Q¦9|O¿Ô¬ëð}E 2!锹 %:|¿e.h)ß�> Ó¾_€2 ã¾>à‰’ïçOLoO‡ªt�k•”ŸÃK/ñ$�‹aÝ*#ÉZººvvT?ãJ�£©…'o™�g“g¤³Å—¨EÛÈj¤¼È´¸:NÂ…d¢’D¸_¶²TýVÃl¶JšÑ?¯ãµ5}Ò7V_ŒNk¥¿m tûoÀ�ÔSášôC¼¼Õoc�sÉïHŽ.éÎhÎÎg Ç;>º¼øà´óàÑé“­×–¼áY…GO=ZÊŒùÿ,X£s£³^¡8®Ïݸ§�ÎΗLÿ?;}2sìd6w"3ê׋тn�®8þr$*ˆÑh%çÿ®\>Å�”EGV©iè»BõJÇ…ŽýhÙ¯hãt½Ý ldM�>XÔ­Zë€/Þ¸vmúz5íq¾‰¿-4ÒATŠÚ߇Û¼¦¸3wyøTøá¿YÅ�ÿ°qMÅœ¶üÆÃ´*å³…˜3õëÍæ?Üùïÿ¿U*lˆ^èæ�Û3/f¼H”Á¿z•jZ�˜Y÷‚¾lx™År7¯&p¯~Vj|M�môklΤð¾æWbög¤¡añDšúŠœ[}ú»™7tןµ3Á5‰Á]§t_ïl¥†üÉ…¦x�hs§a?­Ì^8)ùâ‘ Q­ånD^Õ"uwzöBRµ0”%l�Ý"CªF4Y¹þsM²€­°[“/J¾�C<é 9è-ÀVØRyS5Õ'îëyS¯v¢ì&”Ã&dÄéÌP*“Mø^„xb*“Í9‰ÙŒR Ü{[%²¥@dR•S­D6Cˆ¶Ê ²j‰Œu„9FÆv².Ë9v�é¬èK¦]róËÌ5ɲ7$fYŸ@q> [Ê÷×(:ÏôòÕ\Ôjž€-çì•ŠŽž“â‘,ºM�K§æàE#Š B<ŠÙÒ G;àî³Ø$>:ÄFFFÄ�\ß‚²"¬²i;îr«Éc+ÒŽpÕhƒ$�=¹˜²© ”÷ÀÞcµ*¹úBµjÕˆ´šcÍájEÉ7pˆG²ZmU¥³­ú#I‡^¦š£Þèoà"Ê0" QœX@è‰ÕÕ~Ê­ã~oaÑpÌà:É ‘๠xö!é \�q­Áå€þÿ…Û~$¸�>ûùتÚú÷N–IK�O8<ûŒ,õ5¿|X«œNX[qAŸ¤Ÿ3!¼¦UN™¾¦­¸ O’Gs&8®UæºK®3Uv’ÍJJ®±0³¼¬Hø¢ËV”á8ìñd½mR~½ÑÝ<û@,b¦_lƒ},Æ ©1£CÉm‡}\½-‘È×§9ÄÛÛ׸¿;êOQ²)è”üIåt%mÈ�åãªõ"ˆ – -úN#‡x$ã‡-«Ç ú#³P*0«T˜7ºl=ê…z6]ê˜Æ’ÁŠþGáØ#»ãL⚀ç`Ÿ‹-´x"ŒâEÃwúÒ4ð9ØÏÕßãЗΟ‡-ʨ‰�¾s•C<Š46ÚŽ¨6v„% 7"“6I3VNT; Ò+Õ[oqPr›€œ�´8(évñ(Òxžw(t­9ÝkB½8œÆnÛƒ™tÝWyÄe}9øÊ‚e~Ð`6]C%úBíV»¶âæ)Åjs‹FÆÔólIÏ— W´Ñ‡^äÚžz7úÛ¹d#[JÚjÛ }E¸#©ïBDXŸFãȈ¨:è«F ú°ÁjB‡ÂÛÜtg!˜ntYÑïÙú�-Û¢f¿`x‹vVXÐDup öXý½ÅFxöÑä•DÉ�sˆ'¦·oº_.«*ioÃkw(«X) :P"Ä#Y™ZUéÐŽ²-Ê´×8§.p¯Õ÷¯\p[ÎÇߨÅëøkÜuŒŽ¿ÝoÊêË.5í%Ço®u&XLÄg°vlÅÔ”Õ=}$ç”çà…x ÇaÇW¡k.²Å˜J€Ç`K�„¬ì$Wœ‹Ö âpxöie.Gu ê,ZõõÐ׋[îq>4#ìfúM‘ne¾(J» ê&Œ¯E8”±ó¥‚0ÎçÿÑ¿õùÓð0s Oxð”›_ FÝ7h²£î+¨ú!¶ÅÌÏΤªéúñvÞVQªÜNÑ©6û]ÆE?GmK˜·Q@qœ—ÿ´Õ'ôAñuŽˆrêBnZ‘Ó–›~xF]%A6½`@ÈÍêÆ9ðr}J´ù#2mÀ]°wÕ¿ù£ä¶£ z·rÉLS½rKÅ¢íxpZå†ÐòãëyÓstg™^#§7 {Œ–ýy¤ûšSÏëkðì{ʯrݯ…A�ÖwnÁ´ 9�¬c.Λ/yÌç\°}Ê¡S)è¦ôÞé}Ö8BáŠÓy^‡-5‹T5Õ'î.¯F�ˆòi†Î”|‡j¡óêQ^a:´X¿•C<ª&á2'RŠe<ò˜ ©~al©¸¹ª7«90_Ó‘õ£êEˆ§Þެ_ì‡z·k+Í�]ˆÌŒpÔÍwNT¥ÃE+k5çßè“‚¨¬ˆræ_…­>ê¼C§Ð¦ç ûnK,?�´8ˆ¤#ŒÇië³P§M±à3≩l»Ÿ5ÜŒcr7f­ñT”Q‡U2�¾±zË�zÆ¥Õ|ºòpÈ-œÇˆOLî³1'72 … Z}ß×p¢(è-Î8ýЋ޽dfý*ç÷$2v¡¨{æ¼™7½å ΂]2ìÒ…–É›�þªçó¢EJìÛ€×aKM+7gYÆCFùÆ–í’ÃÌõÛï8.3ÃÊØ%G_ðßγYI|*xyMXegVjcrÄçð léeZ�/CJnxöYõ.웣ØÝÈé~Ã-**â2 |¶ÔÄøÊÃCVNëŠ$ö$ôBÈMž¥®âÓ ì‡Ý_íPr»€`K-ÆZéÇYÆwD®LÙrvÊ� 19 < [je‘xÉ<<û”rÉô1×ö£n¿n£yQÓ’7¤Æv‰Üià °_P&yÜ ­Á4.@y3®ùÿïwæõÌÃʺÌ]´KùleŽ_Æ<*$Àã°åíÅëˆÏàEØë¯6Jîià%Ø—bð¶•_îJ‰iàó°ã[©½Åï xº™¯6zD+GiäPò ªýô_Wigоû=ÞhE�žg¹¼ð92n4l&C6 ¹G5ïˆÆñ$]„#PO„))iI�ÆJãé¹E±Ž71— <¡¶$ox³— gÉôã2‚Ñ’•(õ1Ð%Œo·ùej+ˆR¸’øÛ¹`G¤é¿DÐ2FcSú|)¯;a Ñ݃±!ñnQ» ûròjGÒÆ£†‘k4 oÓD¡¯ *ê!?wé`?+‹á Š©A÷¿%Èùx[Y©êj¾pKvþ‚ie…÷`«KÀça'´©¨q2ä,Á8êœNÁž’e¼æ—Ÿ^…-50+ºPr£Àk°¯)‹z�)‰Áuà-Ø·b—jKXìÁ‘oRzÍÁ~”Œ^·MrÄ%h¿ 4a›±‰öEà2ìådD; ü ì*‹V|ߥÿ!àoÁþ-eí~;Pî�Im¿ãºdüÂ똫ҶÊ]ÛÂ5‰˜ OÂŽsX`�šÔ<)}…=±íÂŒ¥"Ñ/vOÁ–¯«H”ÜN­¼ª,°O+ ¸gˆ=\43‹ÑPüÁÜR.gfh¬]´Žµ à]ØwÕcð’•7\7^¨[�¥ë™ ý©2ß,ªÐY1l¨ /‚ãâîcð ¿i%Ú‹:mâðÙQPíùø£ÃIÂ@œ5Ç(¹â“²'Àù²}CˆŠüOÎE�®Oë�’éáB¿;ä¿P¦rì£áú�ˆ¼é.JùÀ“ |r¥³lÎÎã JaH¤nïÁ–ZB$î›&Ë´%H_^ƒ-.VýåsÀ—a¿\HÉ�Þ‡}_=”®k”þ+ÀWa¿ªÌcëmƒ6z¹¶hí9…C¸öV¥ÚÃkÏ’¹`žg ôgçÍa=»¤[#Û/<Þ{ _$<ûHýECÉ5`(Ö®pÚwÚùÞ¢c—…eDŒ�gµò¬¦d¹�T2¡˜b‡jGÂh5˩ƾ$®ÑâO1S,§Í2°'8l‚­¶ô#ö1ˆÚ!àQØRköåz·²'bÝN`?ìþXš$úÅÀqØãõ÷.”\3ðlõí'†'º0�_Pˆ³‹ì ×­âQlNø2l©v»úT ìyE40× ì€Ý[Ùm Ä|û8wÑšÔ7£åÍê DÅ£ J° vWrþ÷,^�0>ÿ;ÀnKõ|~yˆÍ›VÔí)w…Üp™—`f�åpX+χÅì¢eÇʉÕEàs°ã<,#þ±rb:|ö3±8fúÅãÀçaÇ9oPÃ1Sr#À«°Õ×NËŒ•ƒkÀ›°oÖ#š�+'j€a?L.š�+'º¯a/Æ&Ú€�`Ç9y°Žho—a/§ÐQú~ö‡”yœ“L7JÊkf¢}—a³�±-O7-—ózÆX �È¥?Ö�OÃV)Ýâ–2‹4=.ÈæÆ¿«pÃùZtjœLM4Ú8Ä›´— g¾F²[�ÛaoOŃÀ]°¥6TV-�†ƒG% d/°Ê­Ëõ,�ÝÀØ=Êrhˆe�è¤";ÜæHËIæéÎ,kvGD±xö…ä"ãóa1_d¼cEd,±7à<‡°¥zMëÆ­4úLùg¬œ-X·q g'X´LòÌ%xŽÂ�%²8�êFø ìgêYPr�À)ØRkaVäñðŠS©®»žSÊx%ÇWIñ»!Ek=Q½´`[Ê”ƒÞ¦]ò"Úä§tŸ±ž·Dв|&¬32Ø,9ß4…$ S5�â°~£¦ï¹Þ|=zû�ƒ°“qE[&ßãZ—u(£¢m^§¶âI/D¿¸ø$l©ý'b^ˆ’k>û)eµŽ“Z0“è¦egÅ3XžÕ,^;D|‡€¯À~E™w'Öç®<BØ]kI€ñ�_Þ K¤Ê§»gâÐüdÑvÝ`#M½ÿE¼ áMØ7Õƒ®òÞw&·÷ý¨\ÒâÜû>®2÷Œ"Ëè­Á¡UÄ~¹àçžY¤œ6ecOƒ!!·…W‘íÅÔmÏÙÎCÝÉRÝ"•ðçº ëY,#ÜöšÑ3¾¢Ûy‚º(Ü£¿ ò—W*CñE˜¹L-}É\ 9ê¨Ðˉçø�#äÎIH*xI¦<ËaýÂ�íÙùgu÷"öcˆ�Ô?‹šAxvBkÛ&Wr—`Þ <[ê|±ª¿¼x vë)¹fàiØê£v{©b{F>Ï.U÷#~ó”µ-qßOÄ&€s°ç” î |x†lù0,Af3aÍpìø†´6ÍÍÞ™®UšµVû•½À^ØÒ±ë㋈’Û ìƒÝC?×o),›l -ƒc}C_ÒÍ<]ê¬Ê!^–QeÀ«°åfª¤šŒç ÂøšŒ'Ùl°!*ˆótr[Î.9Aˆœi´~WwÄ·Ì>Çá(ìÑ䲋;=íöyë×¶eç/æ Ý Wv7°DîðiØqÞÕ²NÛ:¹‚ºñNàAØci_éwOÀ>Q×HÉ5OÂV¿7æ`âû¹l±Rqõùgár%á*N O_†-·L‰ÿôt¥“eåúÝ@ÛYfÑá¯z¹ÁZýyÃÿ#ÎÖ¥5¬Ež†­ÈóÛŸ¥ŸÏ†ãD§Àf2%‡&R³%‡:a^ÐѲɵʴD×@–�ÛŒª�Íço,Ø~|Sthë@Æ�<é:HrçëÆìñ¶ÚÖˆñÈ÷uDk­C”Úƒ!îë¶L‚´åè8¬QØR­iÕ_îž��ÀQ”Ü>àYØêGDÉÌ3ƒIà3°Ÿ‰]¬­4ŸáLLd�œáH)öpöB2Šm‰¼%X_¾[ê,žª¿|¸[zE‘˜h§€&lSY´Â;(ù×9Ä£Úyò}½a¹4*ìuóøf·!Dv 7Y7Â*à0l©u USmºoX¥‚áè^µR‹Úö›@”D¨vWÙzcg—.ÌLL„»Ùo{>UòÂchÄqxö…•¶ÎÚNz�Uü%Øï> [z%èš_n^„�ÀùΔÜ6à%Ø—”µ¼™æ‰V+¢0 œ�=£LåÌüÊ[qˆ+…°~'o™[Ý8†#tJ‰cÉL½‚ªGÈm“OºÅ{IG(ÝâUMu½®ÛHí5Õ”Õ2€’oàOÒ4>€ˆ°N#\·Ã[õ2z¥P›¢®…£Z„ê#\ÇTsŒhtq˜Ò×< +”dœAÒ™Xi,¯TVK;öÃò)×á Bâw¥fÁŽð l©Å+˜ž°�p Yt5®áÖ™òÊ¿5{„�¶¾„'`Ëõ#ùO�_[“¹´T=ØÀ5H~×wÁ¡åKF^8 Í�-áqØÇ•™ï�§ÓF aõcSl@�àHƳþ€ÿV£iyÆ‚ðl(‘éÀŽs¥ÆÅÛ”Ü>à lõšh• 1x8 [j°z©3€fF�Í7[´ø/j«Q*‹P%a+l©1æ•›Ú…ïÜ¥ôÛ€ÛaoWæÑ¨»2&2ÂÔÞ& '„&(¹-À6-®‰€æòÈšpKeâ{„ݰ»Õ M…¶KÜÀð:ÄAϰÿ­�3VN‚P;pl©…ýb^„’ÛÜ [ýòï­,º‘D":€½Zù2ïÔê/ñ8Ä!žz×_J®xöaåRé\1‘WÞÃ'Z—‰Ôà$l©Ù‚äúi€#ˆ1ùø8WÊçe£ã¡ì‡Ý¯ÌóÙ™·9Ä[¤È¸¼;„öŠ >âWH'!Ñ[ùq³io%ú6y¼!·÷OñmvDg$ÈŽ@…pìÊ´žñ39g<ôãöJ.ÓQR†KƒÌzÐc ³sÈÏLÇÏiìÊ :‚â™k�9á3°ŸQï®FãuÜ@]ØO-o´Îoìãë®’¨+›¿×¨8êÄb«7÷6á¸~ŽšîñÅXEÝè-%¾„j±#ÿéÑò˜ÅjAWÜÝ�l8Óó$V#8 JxöQeÚÇ,;ò ,8ÊÍ-Ñm ´±’¶€”÷ T&ª„óÛYÂø–QUyH:Âx†ªÚ¦Pk˜åד,$UÂ6Ør|Õ¹V_„¯¯Z« kÆCħ¨Ÿ‰ÅC%|‘°vŸr e{˜¹Ì›|wf-3;hMÂÂÖ4dÀ °/$¯é%H&”F�"é‡éÒx„¤¥KcI/ÇJcf®Ü@3j÷ÜÊ�,8¹æ:<°�?­¯üµ Ñ×ù ^�pöŒ´‹º¤š»txi‡x$éh5=T�Í¿… Œo³ð&˜ ¿µ ñÄÔnH[™àNØ;cl4j mPr�À]°åŽJà?½Ælj 'ŒäÇrȘÁ`ÜÿŽM¹lÞðÒÓáñW� æñc˜ŽõèUvuغò+m–9–ýÃù‡•_õlÕëS|¶[`'0 ÿa[a«�‡ãg·o]•)•6 ÒZ¸êǃ\¿sõªhÈHTz�ûaï¯ÈHÉíöÃVýÙ‚J-Zq‰Åà“°¥Ö^ɵN 3À[§�¬Â˜['¹é;"ÓL°u¢ä�ñµNOŽ#œóv£5a¹`+>�?\gn[†å 7=Äs7ðœV>PZ‘ïö€âõ)Y÷Qˆù£åïËN>ÆæïˆJ'°¶ÔT—˜¿£äv÷–[°À*ëïˆÅ>àØ Ž÷1H�0E÷±U³¿ËÛ fFÏK�j&èï(¹F`|þîLà8.Øvp, î×.”� §ó_–¹•³Q¤~FTÒD|7ðì©;À�CÝ×Þ7�¨tt€”Ü`ú�Xì¦à?)¦è?± ãu€[3‹:…6ÂD§¸¶Ô¢1HÉ5;`w(Js¸ÖÂx$Ó‘Nà~ØR]³X]Ú'¡×Ojï—öIda‚.�’ÛLߥ‹}À\Ú§ Âø\ZË›®çJ¬ û‡m°Ûb“éFG½#�ˆt÷À–Ú�(æÕ>…/vÁîŠÉ«Íçíya�‘nàAØêK$¤I? �~ZY³¢®l=FÛ€m°¥T+&’Os¸övå2é¡ýÁ…¨©¡‘toDmp¶üÚrMÔ½}òøŒ²TøOwp3%WbÓ÷g8ì€-³¬{£îŽ\Ò=CxGîgPX„OÃNèÌÙ-“ -AùPi(¸ê/÷OÀ>Qÿ(…’ëž„­~ŽË¶ Ngýü¿Ä…˜œ^„­~‡„j\ûÙPøn×ÞqígQ\„ Ƶ”Ü`úq-±ØT‹kùOO ‹™õb1O ]MP^”QÙµ@#)åJV0D/ª©ÏAG„'`KUùªšÚœ9ly¯ek»¹šÚ"J“ÀgaK­íÓ%w8{F¹4Å·EQúÏŸ‡-u¶\8ñyˆ�ð}N|žÃú…-‹wbBw_óQ8¤ jCÀS°ã¼e½݉·ÿH0>„=KDA¿Ø< ûtýë0%× œ€-uºv•ˆ"¸^K8¢ &g€—a_N=¢øB¨ý·kâ (.Â# Jn0ýˆ‚XìþÏQ|:"¬cDAÕPT[Di˜`DAÉ�¦QPúÏSˆ(¾1¾�"Š/qX¿ˆb›ß׿yãöÌ‹ñSÈÙð ì8¯GXïäýÉ o րð¥†Ãªþrð,l©{Ī1%× œ„=ƒ~ËA…§Šâ‘Ñ9¼ûzê‘Å—Ã:àví}Y|eF˜`dAÉí¦Y‹}ÀÿÙ"‹¯@G„ñG;øÈ"¨‹¢#^“Àk°¯Õ_`”ÜIàuØê@<¼ ôoo¾Ûëo  óƒÕràCÃW�)íÏ¢ä8Ä“4�¯!"Œ'7nÎäÂÁô`J¥½ wpGGAÐ1eTͱv.Üý�³óyû!…f³Øaæÿ7¢oõu¼É×µ8/ù~¢äJì\ûÒÿþ}Cˆ’ލMµÀ¿©…»Õ"LxçÚ·�„).ûÖ*|B©PÖDuÄd7pìú¬§X·?1I|Eljh °v{,!;ýb#° v—²Fš+S|¢u†ˆtã[ã‘Lô&*áûlΆ(Ma¡äNÓa¡ôŸ¦0ÂòÄ@˜¢'~kÆë‰å†#ˆLðì8âZÇoœñœ2]Ìë®+ì–‰r pì}±¸eúÅFàa؇•³}Õ�†h-"6G€'`Ëù7þÓd|óÛ¨vokïÏ>*ñš&ØG¥äNÓì£Rú7€7µ$û¨ß„¾­¥ÚG¥ä8L©�úä@„ñäÆs³ÁU×–ÍæKfÞ6ÃMÂm¬yÛuó†[>·°|ÂdxD n-àÄñáyÓ}Ÿï⟃ýœòû\ðæu‡Ž‚À®3w„ÍDË[qž]tÝKp¹‹ð`ò÷À�ðì Êï±wå(€SÊӀ…»Þ¿ R„êÇjïPÕñ÷µ°»aÂ]ï ã ø®°»á>Ⱥ2éÂŒmyºiù‚ êÔºUI4/ÀáUØW•_f¿ß´›Ù¨Ê”7x–2‹Lî„èw�Ï„ûaËíyªº�•úÄqÑ–�ø Ç`�Õ¿e§äú�GaU.µV–¡P9ŠÈ$ŠhxöùØŠh³/¤šÅ³¥iàŒ¦p¿OõTï,ÔHõàs°Õ›%a/IÉ?Ï!E[‹zæ�¾`�àVØ[“sÚ?D’„ñ9íçØÅ`Íf3œdÝ™�ˆ¬G·Y·«Ó�ênx³/E?@¢e¢ÙùCoÀ¾¡ü>íè yŽß1 ܶ(¯!o Ûa·'WÌ?F’?޵˜Ï±«v苎‘1]*ïðPUÛZ2/8VµRþ æµãÑI¬¢Yøc/–Û!•…?A¶ý$öšBy墮”7�¯­-å>CÖÏë‚N'‰ûÙîú=ðàÂ)Ñìü ‡ñÕ”mܩʢŒ~¹J¸ ö¶DúÃßGj?Õâì 7M”|‡)õ‡†ˆP:7j”Cíkët¤öótËáçÈûS*‡_ "”Ï rx��K§fPÿK-¼]$B<1E²×Ì cñMǸN§9û•1Ð?{ûÖU¿âö1ÿÃË/³I67{gzp0èõM•<»èøý”�±Ìx¤о�œÉ‰¾Û¯ð>„/Â~16Ío½Ÿõûªî¢ý°FÒ€/Á~©~j[7 îqˆG‘ǘ °³Ã,;ï7t–_óP¢! ±þ‰‚Q°�å‰þšñsMÚ¿‹,#ƒ=–BöýÒŽ0ßu0;ÿ‚ãçÒ­?à祟Y/£;®_#BC<Ë~ôÂVŸoϲ?@ÚÆ“e»°à–?‚Šn[©9ëS“Ú‚á.Øê|M:nXèæã[4(Š"½=}uúâ{’]ž½q åÊ^xvzvše–ó¾Ë;.Q3þ¼ 'a«¯Þ]m.£¼? B¥oe÷Ìw.t�ÃlPØRÄþȪõÏԪğ íã©íQ•0ý¾ÙbÉz ^!þ1ÈüãX3hT¤BHT�ÿL Ga�*³î}¸hæ 6°?;ÿ¬î^´)æðŒ, o�}H˜ä?1Â^ؽÊ$÷²°¨Ãü�ªì;:&ž�ÿ¬Õ&:øOw3†n–c?ÈŠsûSð!Ü [êø³•³¹&ògHœ°v{ 5yü3¤aL.DÝÇþs�!ŒÏ…øÄ.™nÁ¥�âÄþÈü ebÕ:6mTêšüK-ìŽvÃŽo«Èº]“‰Ì Œ¯Þ‹KšÒßÇ!žØ² *œ�^zíÿG¬µIx,€’oàP~H‚$ú´*�ÿU §—#”Ÿjæ?í¾ ÿ¯¼‰‹ÉUö¿¡¤þ7Ô™ ²ufÝ}”m+}â É“ÀiØÓ±©zÝU€­“+¨K?<û¸,ñ5¿¼xö峤Ƽ1%·xöe9o§‰,×¶-Âe»$ZɈͳÀ`¿ Ìj gZ¦»H Ži,U®¾ËØN6àÉê—"ÿ?QÍ`K]ç®æ™þ_H:ÂxüõÞÁ=j—.Ì„†-Íi¹L”àÿRÿ»Ç¢¡š®©Lu8X¼ Hò_iáÊÞ’-²$ßÓ5­I¶¸v|í|Íêÿ¯P „=°{Ô» Þ(ý^`ì>ii4Ô�ÆÙù ¦•äö¯¡ÂvMq;Îã+â_C„;aK�￲hj¶Õ5CP"° ¸vœ§l×�濆 ;`w¤ MJ¿¸¶Ôö±u¥Ù¢•ü¨’° vWýúo JÂnØr¡¦¢B‰À^à>Ø 8ÏU¦é<)ý^`ýœç6šÇ¢ë)g¬œ-ÈðÏ!Ê?Gj‘­Cbýsˆòϵ8·;JôÏQCþâìÖâ *jôÏ!Ê?G½Ø [/úç¨ qöh²Ã¼ë tkvþŠáI¨óßB‘„»µÄ®‘ø·P$a‡×5ê$�@¥NL�ÿŠ$ì‚CíV'¥ß TªœïÕÀûꜵ^´K–hÿPå_h‰6ðUþ…–rÿ(Âø¿€* Ólà)ý^`ýø‘BÝ©\ÎÈx†hGé/¡Ì¿DvµÈf—˜JÿÊüKäL£Ç$¢„JÿÅCÈ`³ú«ô/¡LÂý°÷§ RJ¿x¶ü½2µTÚ¨ô¶§{FÁv¤ÿ²$ì†çác5$úï K½°Õg“$$Jö{`ÇYEkHôßA–„½°c¨¢Â¥ôû€LS¨¡ï%Q~q„ Ç¿‚,ÿ*Y‰þdùWiKô¯ Ë¿JV¢YþUÊý+Èò¯ê*Q¿3?ãÎzö†•_døï!JÂ;óÿ¢$Lµ3Oº� væÿ=Dùïµt;ó”~°®�ù÷.í¤÷ HÂ;óÿŠ$Lµ3O:� væÿI˜fgžÒïÖ¯3ï·ð·J¶gÐ*~Gøææ¿†,ÿZK´…ÿkÈò¯µ”[x"°˜` ÿ×�%aš-<¥ßdZ½ZøHô¶ç˜Ö‚ Å¿�* oú¨òo´”Ç›þUäo´DÇ›þªü-Îñ&á…$ƒ ao,E˜Æÿ�ˆ0žõ,,\ÏB»t£…@z^aQËÿÌl{m–[¹ðjaÕ%l×[¹@É5S]¹@v\¹ðB„°cˆ…J¿ø>]¹ð¡JšÿU¦ÚÐ�½ÀšÿU¦9±Aé÷û´:®\6M9N´Öÿ±þ-Dù·Z¢ƒ Qþ­–ò`Çߢ†ü­–è`ÇßB”«¥;Øñ·¨ «Õs°c/Ћ´L�æ‚2ÿ“–èÌÛ‚2ÿ“–òÌè2-±™·ÿe¦9óFé÷ë7óÖ̼[UùýgH’°¶T@$&Ïÿ IvÂîLCžD`° vœQN yþgH’Pm+�š<)ý½@¥ g]y¶Uä)ÓÐÿèò¿h‰®ûÿ/ÐåÑ×ý«j”ô•Z:1�þè’°¶\¨¦QJŸ÷Ösåõ›þ5dI˜à¸ñ¯!Ë_k)�ÿuä×Z¢ãÆ¿†,­¥;nükT‘_kõ7næN¤$ø_¡IÂNØRí­˜>ÿ+4I¸¶Ü0‡¢>‰@°vœõ³†>ÿ+4IßVuq}Rúû€JÕs]}nçô)ÓÎÿ7ó¿i1Üâñø"ýoæCæ4JgŽ¢H‰@/°OSréƒ0 l¦üþÂs ”ü~ñÄôötÀ£A×›TIùÅKÿ_À”NSø¿ÂªUF<’•tuål_»MX�ß×Â#÷ÂŽ/ ßâËÓÊE¯FÊ€ñ 9 %ßÃ!ž˜ ¨³Æ¼— Éÿ%CÈ`³DJéÿFÉÆ7ä"\J”|?‡xä2`Í·f³UÒŒþùÿàµ5MƒÐ7Zè-ø•öðo­ô·Má�nÿ øí„þþG:ñòV¿�9ZtÌ%Ý3F—tg4g糆ãŽf_]^|pÚyðèôɇÖkËÞð¬Âƒ£§-eÆü¬Ñ¹ÑY¯P×çnÜÓGgébš¬1>vúdæØÉlîDfÔ÷\£ÝÅPìHT%"ÐJÎÿ]¹|r)s¬ÒÑÐ!v…j”Ž;XûѲ_ÅÆ'XÖf–í1#kzôÁ¢^s2·ñâ�kצ¯WS×nhCŒ•Ÿö÷áß6¯i�ïÌ]>~øÄoVqç?l\S%§-¿a’D%³…˜3õëÍæ?ÜùÿÞZ¥¿†è…¢›â Çà_½Ê5­NÌJ¦ˆƒè±\ÎÍ«YÜ«‹•_Saý ›3óÆ:_‰Ù�‘�†9Ä ëkr^uô»™7t×eŸµ3¥Btf;�Ç8ûÿgïOƒãÈÒó`4‰n$@€$HIpº±p_@‚$Hl°¹ »›Ínv¢* Èf¡�™왑fdKšÑbkµeYÒhdi$ËšI–F3’¬y•ìû}ÞdÖýo܈ûCWqCn„çæ›ùdá P ò,™I…ÝÙÏKV±Þ'Ïyξ¼U9Á_ êÀ™pö°4oîä#÷ÇÄ#@CxùòáøÔÕÌ^Ó¡a ìf1½ý’±P«·ÿò‚¯ÄîI+_È}+ƒx^�|¡šz+p7l¡ªéuËc£hµît{™ñºVórß´2†Üïa�¢Œ o|�îuB$¶EÇ\²ì²[\ÑÍgf®LMt��î¨2Jz��º=û±ÉÔt3r�ð-Øo)ÌMÏòеŠŒ#ˆf´I[Í(­Ü$÷7Ä#˜›u/K'vŠc ² B<’ÉÒÎ÷>Çtô¡¡!þ+7ë‘QX� ìv…b)»Æ\-±DíüVmMG2m±l ³¸‚UœbÙ"K'¨ÈÄ#®]­V�ôšÃm¸i¹úù‰iµÒ©s¬„ªÎïˆÍ›ŽD, jJžÛ�‡aVV•ïö{Ë##•Y%‘ _"v øö…]  îšÜ3º–¹Ð…tÄ{xöQþë~ùð!ì‡Ò5ÿÂùø.ìw¥y4úŸEãpNB�¡+¡^`KhºædiõJ÷5ªÄíMàEØÓ‘ö®QÉuâ¼Ø»O‰¬é[€£°G¦JÌ ¹Û¼û’|û:$�®—Ä£ìícbÄ50Eæ ì+é÷.ÈýƒxÒ¦Áø�ìkmØ«ðûŸœÄë�ò½ŠjB‡Ã³5†3Lô¸ú¢ßÜù5pàoÁôæí¼+By;ðìcÉ :š'<ûxúJ"<Á Eoßð¸’W1}czífiK%A3Š@„r#†Y:;´pð¡øè2f‡3ÊŒëÄ.éKõÀVØBó;|mßN¨ƒ°F$A¥ô¯‹Z´ä‚ »³E“*CçÌBúNðl±¦ºö>iÃ3† Nej”‹×8ðì;‰ôçÖ¹½ ¼ û®tîm Âð–.úÎ=àØB£µ5\Ž®¾`”hAn9ˆ¶Í .›Ž©¨ÀùÍ”QÊëø"/í]=¡ºÖâp.¸p5`\°Ì¢OØ*U‰àmµ€áaØbö5TÍ%³¤[–¶Ö]«4W Í,(¤Úh;ú¼Ÿ¢v‰›3e.90d?mö =7;P'wô¦¾­´ÔÍÊ*�-�ƒœ‹iq²5ËÞ¹¯cP®wÐ(K§¹a³hnt˜õ³5´^Ÿ÷xo¡ö6 3ã)Ñõßhl2:ïy‹îÈðpÑ*˜¹•\Ñr‹Öì�íÌ Žgù㻞1gºCô6Íg‹¦c ı¯³š¶ò'¼û~b¯ÖYy¥A–ó�»{ÍÆ¼˰ËÊFc]ö"­´»#~7Ê=úþ8Cöƒ£TŸöO+«eꬹ²S«š!‡3ÀŸ�ý3 ûDóÁ—jºÝüYØ?+-©u½ýµ™"P¢ø5Ø_S˜'®çØÑÕ1ëÿðë°¿®Ð±_¾Šnœ6¿ûé·9äþ·Ä“6�¤@„jZà³áêyU(2ê‡Ã0Ýòj¬˜sw[˜‰Aø¯M!J’ý�kêœL˜3³?Bb4Xs%kÝoîé~"xx¶P’½px¸nº¿eTöˆ:‘Þì…Ý+J~Ý/7ÏÁ>§0Ybæ<ÈÝfàyØç¥ÜEì_ x¯F.æ.cDmø¶üw=Åì¦WXOi³�§M;ŸÇÄ£HWÛçM7çXA-f A Õ-“hô�êÝÞò C”ê”rÅu³ûgü¨ê¸B¡è78¸6=~Å4xÔ{´p¹ŠðìÂ]»½²©I4N3ˆ'íBªC!f4œgÎt(¤qzfÞrý~L.Øz)E‚ëÕ(bè¶íz”’)ƒ²{ÀOa:tä'çb¸q$g‹´-Êÿ'gf²R‚=¤¼KÙ^ (¶w„¨MÀNi[ÔöQ†¸í À ØJº‘‡Ql Âê,ñu#ÉÝ0ðØïHËûuݯ5’ö]àû°ßW.Ú­aÞ éõà3ØÏÒÑký¨Ðí›ÄtX‚]R&ÕYà ì•t¤úøösi©òï$ÿŸ?û3Òo,™tLÈ �žß½~^9 ô²£ðð4Aã˜e×äîP3±áƒm'›4;DÏÎD=XŸÖ'eË1ƒ®¿á�uüÊÙ¥†=¦ë�Š–;/T¹õƒ0¡Ü|íF•[#™ sWkDìðìGéTk £Ú¤¯oþ­¤Bë‡È߇-Ô›ã«ÐÈÝ9àcØ�å+4î²Fþ?~ûCiÛ¦M¿Ž(º6oéy%†pìmR¥‡ýÖÞ%k®dzžÙ×›Ÿµ�ü’QÊ™ùÞ¸"»}ð |‘ð(ì£É‹†Ü5û` �X“*­ÁL¡áWÚŧ޼c—çæ¹eô$Dx¶Ð ‹:ìa’› ¡Û”;­¦ÅæSÌžhæÎ öì©d>mÖíl€Ý ¼9’?¢3ñ^€}!�VIúˆqn…-\¬ûå]À‹°U\Š©gÈ]#pT«œ’ÔoõÃÃfºÁ®™c¯²]Ѓs¼…�X^š°MemF³Ô¡ÊA-ÜÚF¸¶Pw¼¦×í�¬§O1Ç%×y߬qUWj� òßìÖÖÝ™›tuÌÌ,+¬Žûô»Áš¤Q,® è³V)UFFn°³[çL¬!WPq�-5'NÔÞÎÀžI§²–™'º#ÀqØÂ Õë~ùðl•‹1õôó<\EIa‹Ì‰“çw€�` *™'V‹ÀeØËéèUpNœ˜Î`/(“ª|[åúÀR}¸{%ƒ¦ˆü?~ ûSi烹%Ë�f–è(gq%:æ6 9»äVÉÕ‹FΜïIã¥?–ŠÏÃ>/M«[ÎÍÓR8'›c`@]—¢îˆß¦Ëqtbö^� âQ&í%Ó™�q» ¸öÎLjab° Ø [Ý=^u‡Ž dÈ>`�€IfÈ`ì.é 9< çÍEœlu�—Ñ’Yº¸oÖÈ=õ?⮎ˆb7ð*ì«éõŒ™#xYOTg0¹‰Š—;6¼ÇhUð$ì“éô#šF%‚³ßvàAØEy¯ûå]ÀS°O%ß› w�ÀÓ°å·�µÓÅmâ÷† î#Rg€·`ßJ¯LŸe º2ݯOÛ½‚j¯h¸¾±lû)d.§nKfÎt]ÃYáN­ 2Cß´Rë$Rè¤ÒÔªO2˜\ ¸cMRî*�Èž†-Tòø«ÀæQ™ªD¸xö!%u ýâ.àØg’¯É]#ð,lùƒA‡‚IZ?•Kzy±úp“à&bxø>l± sì§á˜‹j x-%¿Î¶ýqVtÀ¾ž÷+Ìšþ_âþ^ú§ÂR º1×I¿{ï³ôÓÙô[tœ´ÏåÊ�óe F$ÿ¢cSÕêÿ‘;Ý™ÍÕl='I|ßdpcÁœmç}r´}"Ü.Ræ¯ñ΀¡Üf•�j¼mviÈ|fñ×uDëpöH:uÝÖQ� Ü†=¬¤–£_ì^€­r�.¦–#wû�a‹-,¯I>�Á51^�}Eý…– œ‘‘¼Y0!Å>ÎÁžKG±�!ñ€·ëÛÀw` mí®ùË7€ó°çÓíЂmI‹–{¹ÿ˜A<’4ýºÞ,¹eÇ ÷ûyl3Œ‹¨¢‹Ã¹›,fÇ»z©(Û¥òBv¤†ï7áï0£“]侎A<Š’€BoåbŽRöh•ÎM– p/¡pÈÑA D(ž�Þlš0¬"•¥¿*á=¡Iíp° v›Å€ÚfÙ# âI;ã."³"ÌHÆ£p=ª”Æ¥±’nxž¹°è­ž€Gä†\Ѧ[D™›cXn¸Í9dpWÇ—Àû’¦r'6wR^†ë…“’»J¼oW²Õ¹¯c0£*q )aBUâô¢™³ VÎXÍ”—¦xU «ABù*±Y6ňFƒU‰×�Yf$ãëp}])�CÁºÍ—,øõž5HG¹£sßÁ,� ÇÁŽ�9X-ÉôŒ?ê\°:mÞW9»¢û&ƒªëèîÖà{ɳœhæ�»Òž_Bf†E’{;]3��š!W¡ã17@ˆP*ªK·©nà›°ßL~¸Hîö`Èg˜ž£ãMtcÖŒn÷l^5©Aà5Øb'ï6šö8R2J¶A¹62b¸O*zâÿßXy®ÄqO‡Ð¾ÄÀw` O,ðM‡\}¡Ø÷x›&à0ìaÑ·Y÷ËõÀwa áÓý[¡|ö{ tÏn3¯¤<¯î‰Ô#à"ìEirƒüÇÊrT�Ó(TXýrZK©_ÅùªåÞ7˜D’2c"É7Ønù< ZHá¿g‹¹… ý ÉèMj™‚›¿t×znêìùô  9è¢CÉMøm�$Œ¦‡„¹~Ó-¸Ž0½ñÏUx»-ëY.È}ƒ�î "”ÿìxY:±ý•»Z¸ì!E�©ÏY½Zï ¦»hä̾ީéû·,Ïìð;Ù–éWôQ}fêÁx¿~䈾þë• xý?èºçceÏ^t¬’×÷©~P7ŸTvÝÉobÜC~ö•’m�óvÉs磽Wë\o~ ö—’“ç†Ið# â‘äq,g—ô‹ƒúê‘sH`d$ľþ½wdÁô‡6+#½ü‘ï#É�Á>–AòMÁw„І§ùÙw?•fŒÙ¢Ùç§¥ŸX ^Îp\¿D„’Mƒ¡ºñ)’ÍÀw„j’¬õ ^®k‹ÑõžÜÔ€a+l±ÍÐì§W7, Uç]Ã|�¿5~mFCŸ˜º{™«¿óÖøÔ¸ž[)úõÞ)�âñä £öøªô‹è†;´€¥omÐV·ŸŸæ; F¨ÃÖ¥i¶¬Ý®&RVÞÂØ-”fˆ£°¬ø tÝrq} É�?��Ì#骹áð³ýRí:íkvÂîL§]‰A¨î2~å�ÿý âQ–QæÄt1éµ+-wÏ›Ü×1(> ‰•¥ó�®,DˆG2U:¯Ñ^õ¦K‘3Ä"§>ÔÖ\ /Q¢ØJLäÎÇa«»7:Á­Ä† ðláCë~ùpö„Â$‰™ˆ#wû€7`ß�–óN:àÚþàÁnã-dÄæ-à;ZeW’U_Á*Yî|tYv´Í6 tÝ^Æ=UôÅŒ�¹À,íŠò#¸ŽPM}­‡K×^…¡Ï™%Ó±rîˆÎËÒ3B]“é+nT?µ*ˆ*>«…í³`Ú$Êô…•Ô:·õÀ°$_Ì"/{a÷J«‡ÿšEòx¶Øð jêc‹ÐÑüT@Ø[¨·Ì§ˆT@¸önù¬á_$%­À=°÷$/ÍäHØ[hc‡¤4É;p/ì½Ê¥Ù$Ó?ÉC•„°;’Whª$ì„-Öé”T(ØLâØyŒBóP%aì® Jþ»�=°{”+t—l #Ê4‘\M¢ÉŧRÊ4‘2õšè]T’*5‘=„:l=y•šP&áØB= I•’ÿ^àAØBgÒ7Tis~ö-ý†&¼M}²$ì„­nê)V¢È’plùi'‰ÒOívÁVYDc$Z€, »a+(¢Ü¥_êêšD ÝP¢Ûò³“îC£hñªsŠ$Ü[eG,F�sP$al1~u�v TOŒO�sP$al¡Þ•Ü@ŸÜw2ˆ'móH�•Î7TE5Ÿo°ÀŒP‡­¿"ãI:•×Lq?�& ÷›á�Ô'èvÂVY>côù 4I¨n1¿>Éÿ~ TñÜPŸ;%ƒi9¦†MšÚÉ–‘:¦ƒÄ©NI‘�n`�&1ÛÂ'RÂ$ÔaëÒïϽœ@î0ˆGÑÛÓIW“nD¨áù¼´ Ìh£»­ â,¤Õ…³=f''IO ·¼{Kƒ¨Xbr)g—ræ¢ãyP݈ž;—È}/ƒxTåR̺'É2r¦œz.•‘3åls©Œœ‰P8—j~«n*_Ãgôß^[ÓªúF}£ ¿Òþ]3ýÝëá�îüø‘‚ºV¹¦ý/¯úmJÃ‹Žµdxæð’á ÂXGÃù�‡W柞wž>;v¹ôdåé'^iáéñsÏ–rÇüÿæJÃ3ÃSÞÂâ cæî#cxj¶lùÿðıógs'Ïæ grÃ~õ5¼`”†ÙùØ¡(ÊÄ¢™X\þ«J>ø _£:X%¦�Ãú *V>Çà#Ç~¶â—³#zÞÖK¶§›yË£æ�ØÝúkwoß¿SKzL ÂFƒ�de¢ö×áßm^×N?˜™<~¸å{UÜÙëוËñ’ßÄ[¥¹ÕìÙJÌ‚„ûËÍÖß<ø|P%ºè…îÝ�ž|7çEš þè­þPCµ37Å|æÝ+™ÝXMåQrTÖŠ}]Ñ­÷‹nÁ*š|EqÅFjdO¤®Ÿ«_OÖïMŠfh?oçÊ•+Tt«¤OÕÊþ¢Qâ„§`Ÿ’&Ï�†äþ4ƒxhÈ­Å„ÎzM Ç „5æÆ_ž^Ì0 d,Ô¼† !Ü {oú™Cî;ÄóªdÕÞ[�{a ¥RM¯[E˨u÷uäÈëZÍ­giå¹ïd°jë™dîL‡W?С¼’ùÌ /›¢àÐÑ=Üv»è˜K–]v‹+•ëÆiÑn¼ G8á[œ/¸yJøö#…ùëY^±Véc±gÏÓÎ_rÿ˜A<‚ù[÷²tb§D¶ "Ä#™,û×Õ}ŽéèCCCüW(Ô#·°<Øû*¦ìsµõ¢è›U³i)fk˜ÏÄ#¨˜-²tè³í âpÍ{Š_s¸/lo€D@®>D~bZ­tê+EW Z¥yÓ±<:ÝT—<·Ã>¬¬†ßí÷©GFÖNE ¼|û�²ò¶áÝ{F+&ÞÀ+°¯ˆò_÷ËG€a?”®øWÈÿ;Àwa¿+Í£1\ì)rópc¨ÄÊEy°%4]KÛ-ën†Š[؈ç›À‹°/¦#í]£’‹7Äy/°vŸYÓ/¶Ga�*L•˜er·x ö%ùöuH ]/3ˆGÙÛÇÇl`ŠÌØWÒï]�û1ñ¤Mƒ¹±V²¯µa¯Âïr#¬Ê÷*ª ÏâÎ\0äFW‰Sl[_0½y;ïŠPÞ<ûXò‚ŽæÓ �Ã>ž¾’O0ˆGÑÛ7<®äULߘ^»YZÅRIÐŒ"¡Üˆ¡A–Î-¼D(>ĬÙá]?ÔŒëÄŽ0éKõÀØBs?| àNH„°ÆUA¹ôG�⢨Feä’³M'g̓˜¢†Î™�ô�}Àk°¯)ËÇ†Õ 3xÝNÞN¤S·Îíuà ìéÜÛÜIÇ[Äè;€�` Mª­árÜbÿ®„±~ ·2K¸l:fñ×—W^Çyiï‚è Õ5‡£0>«‚e}ÂV©êæ?î!W è†-6j_C5 ¨Ì°£H�:Å$ö‹é’Q,sÇ×Aé PÕÆ(Ž2ÀŸV� ”²Ÿ6û„ž›N‰šûJ¹=àA5×ÍÊ*�-�ƒœ‹i ÉW›–i�Ü×1(×EØ.K§¹a³hnt^Ój÷¶_Ÿ÷ŠœÌh”½ ÈL{Jôÿ7 ŒÎ{Þ¢;2<\´ fn%W4‡œÁ¢5;d;sÆãYþ߸îgÌ™î½ÍAóÙ¢éXÁZrì«Å¬´í…ü ïþŸØ«uV^i�å<ä.Í ð~ ,Ã.+’uÙ‹´(ïŽøÝ(oôèûã ÙŽ P}üiØ?­¬–©\°æÊN­j†ÎöÏ(ìÍ_ªévðgaÿ¬´¤Ö�$Y›)%ú—�_ƒý5…yâzŽ]š‹qüsÀ¯ÃþºBÇ~ù*ºqbÀfí°¿‘~›Cî›Aƒý,½Ö� Ý2JLç�%Ø%eR�®À^IGª��Ïa?—–*ÿ>Gòÿ)ð3°?#Í£…�ÌÚîx4”{€-Z¥Ã­¸íªºÔ‰»$½ãÀ1ØB{»øKÒÎQ¹©ˆrp¶ð Ý/w¯Â¾š|‘"w�lžØ­‰nž�+Räÿ:pö¸4�}ËóVn^wçírÑ/P¦î– +gùŒ— ß«Ö�.‚/•KEÓ C�ÍK&�q2h¯‰çw¯ŸWN7½ì(LMÍ8fÙ5¹;ÔýàMx ö%éw8;õ`£PàA×ßðÇ:þ !J) L×!-w^¨r{„ ÏÂ>«¼rk\�xÍ[­±{ÀG°Õ� Û°Zk­Ð }xöm%Úáû°…zs|¹;| [ì ûiwY#ÿ?„ý¡4�mÓ¦_G]›·ô0+á(XÜ/\³Ôì]²æJ¦ç™}½ùYkÐÈ/¥œ™ï�+B±;ßÄ �Â>š¼hÈ]°¶Ð†5©ÒÌ~¥]|êÍ;vynž[FĨ_«œ l¡“!uØv%7Bg–¶3(wÊN‹Í§˜½ÜƒP.!spV2Ÿ6ë‹tƒ 6ÀnPÞÉ-"~o/À¾�N«$}´ˆ8·�® Öýò.àEØ*\ÅÔ3ä®8ªUN6Iê·�z„á!9Ý`õ±½Ú.èÁyEÞÂN,/Mئ²6£Yê0( ¾š�û` uÇkzÝÈzúsÌs�wL©Êý–ìd�ÿ.`·¶î‚फãa¼:¡ºê¸O¿¬IÅâÊ€>k•¢QPedä Hf�©½רRsâDí-à l¡½ûü•µÌœ8юü×üåSÀ°U.ÄÔÓÃ(S„a MÅKωƒhVþl±Ỉ«Eà2ìåtô*8'NLç€ °”IÕ>ƒ­r}`©¾\�-4/Ù‘ÿçÀOa*Íã|0·d¹ÑÌA-®D'SÂf!g—<Ã*¹úbÑÈ™óá-p¼ô�…¥"Àó°ÏKÓßê–i•«s²aU®yQw4qÓå8:1ÛʼnÆñ(“ö’éÌÆ¸ÝÜ {g&µ01Øl…ݪ,?êÈ�}ÀÑ;’Ì�=À.ØB›'×6Ðóæ¢?N ¶:„'âh É,]K8käžúqWGD±xöÕôzÆ'Âl0㉊ &7Q!·›˜¸ž„}2�~„ÔnbâÛ<û (ïu¿¼ x ö©ä{ä®x¶ü²`7ñ�2÷† î#Rg€·`ßJ¯LŸ e º2ݯOÛ½‚j¯h¸¾±lû)d.…KfÎt]ÃYáN­“ i•ù‚´RëRè”ÒÔªO1˜\ ¸cM¸Uî*�Èž†-Tòø«ÀæQ™H±D¸xö!%u Sïe}WˆI×�ä®x¶ØB3ûé¡`’ÖOå’^^¬>}%xÆŠž¾[þîÐpÌE5 ¼Œ’_gÛþ8+º m÷+Ìšþ_âÊ^úÌe…c®“~÷Þgé§³é·è¸ —+;4zÌ—êeRò/:6U­þ¹Óý È2­‚$ñ}“Á% s¶�÷ÉÑö‰\p!J™¿ÆcöGHnVÙ¨ÆÛf—†Ìg]G´NG`�¤S×miÊ}ÀaØÃJj9úÅ^àØ*èbj9r·x¶ØÂòšä\ƒQàØWÔPhÉÀÉ›ÓRì#àì¹tÛx °¾ |¶ÐÖîš¿|8{>ÑŽ-Ø–´h¹wA�û�Ä#IcЯëÍ’[vÌp¿ŸÇ6ø;+ºõœ»É:‰™]Š2¬á±Y*/‘UjøŽ‚¡Dm|F'»È}ƒx%ÅËÅ¥ÔñÒ#Ù&À^:Bá�£q)¡xjltz³i°ŠT–üª„÷„&5ˆ À6Øm"j›eSŒht0ˆ'íŒEfE˜‘Œ/Áõ%¥4.�•tÃóÌ…Eoõì;ÂNäŠ6Ý~Ê ØÃrÃmÎÁ ƒ»:¾ Þ—5•;±¹“ò \G(œ”ÜUâExËVK侎ÁŒªÄ«H�ª§q7бš)/M1ºyŸP¾Jl’M1¢ÑÁ`FUâudV„Éx®Ç•Ò8¬‹Ð|É‚_ïYƒt”;:÷lÀ¸sqì™óÝ’LûüQç‚íÐi“ðŠÍèŽÙµ÷qWÓ7À��9$Éö],\_„{˜Â �Þeô¸ž€}Bšw;ñÆžÒ0�…òL‚atɈP˜³Äî]&fÝÀc°�%?º%w{�Ça—Ï5=G§±èÌȬ]äîÙ¼’š„”&Y½%•kµr¯§d”lƒ²ndÄpŸTþôÄÿ¿±Â=mC·F¼ œ„=©0#7˜¶Ù¿ú&ë_Dà5š€}°Õ„Ø _¬×V¯‚�´Ò™Û<´·a¿-­ôÃköÁW’\’\t�…(Þ.Â^”¦šà=vLz*¼ÇŽ»Kr ®#Lohq ÞnËz–Kr_Ç`FC‹;H�å†-/K'¶m½«…+ªâQÔúÎ*è}Ø+zÇX0ÝE#göõNMß¿eyfï€ßµL¯¸¢�ê3SÆûõ#Gôõ_¯TëÿAÐó+{ö¢c•¼¾OõƒºùÌ ²ëNxã€ð‹°¿¨¬�l{œ·Kž;mkZçzðK°¿”œ<7L‚a�$�c9»¤_ÔWOsC##!öõè½# ¦?jXéåþxIFx ö± ’o ¾#T4òËÏ¾ãø©4cÌÍ>?-ýÄZðr†ãú%"4ø“lôÕ ýø“l¾#T“d­õ‰êû2¹©=ÂVØbûŒÙO¯:nXªŽ’†ù:=~küÚŒþ†>1u÷62Wç­ñ©q=·Rôë½SÅã!È^…}UúEü±Ý[†{ ·æåûDTøØ2)d»ž†;´(¦¯F˜Y·ŸŸë»àG¨.b†ŠT|lÞû[�Š�Àï‘ÒTlY»ÝO$™pÏ’×5±ŸòWˆ�á;B5¢Ÿ@×-׿P]ß@€ÌÒ TsÃægû¥:oja‡�°vg:�·‘„ê.#âWùßÏ eIeNÌ8‚^û‰RÑr¯È}ƒâ£<ÜÂ%Gç#-\™‰�dªt^£ÐêM«"g° 䔡Ɇ–Kp+6‘; ‡-|œ9Í­ØF(¡™ýäbÄ×ýòàì …I3OHîöoÀ¾!-ç�t°Âµý¢ܼÆ[ȈÍ[Àw`ËߘÚW°J–;]6mSŽbÛE·¿qÏ΢˜ª[Ãâ®™rp¡šúZÕ®½JDŸ3K¦cåÜ�—eÌuغòú©UA4yº�¥ ¨ÃbúÂJj�ÛzàØ’¯Läa/ì^iõð_SIþÁ›ÃÀF�šúØ"tµA* l�-Ô[æSD* Ü [~(XÇ¿jK?Õ Ü{OòÒ,@Ž„m°Û2�&ýR;p/ì½Ê¥Ù$Ó?™ƒ* ;`w$¯Ð9¨’°¶X§SR¡D`0‰cû1 �ƒ* »`we Pòß ì�Ý£\¡Û%ÎsÏC”ó(CM¢eˆO óå¼&ç[V ó(!óg§¦òVµX�ÎC”óšÒëÔ¸:�2¯©¸N-N Íkç_99Z�¥…ìiÒTÎ:ÅJÔ‚,-(£^T²µ  ùƒ@nIKÔ‚,-Hc“°4ä$Jþ{€:l]¹D·åg'݇FÑâUçÇP$áØ*û`1êüŠ$lƒ­ ƯN"Дê„ñ©óc(’°¶|Â=Æ'÷� âI›ÆS¤@„J§ª‰O5ÁŒP‡­¿"CÉ-,º„)%É]=0Ó¡$h¦8”\€ ³J’ÿvà+:”,A•„)%KP%a¦CI"°˜âP²Uf9”$ÿÝÀ-©¡d=†’œäl葇�Ī1>mÚÐ#a+lùÍCÚ${€m°…ª1>mÚÐ#¡Ü¹9m’ÿ½ÀØb�±¤¦9!ÊE-ÕiŽEˆrQËxšƒtSœæX„( ³œæ ÿ]Àä¦9V#­qòû’$lƒ­²þˆ‘ç'�$a;lõ¿<‰À^ TÂ'ÏO ÉO4Ù½rò$ÿû€R]› å¹C. ]: ؤ©­Bb4ê@—Ò¦^8m$5Jº€RuŸFè’°¶X¿ON£ä_€-´ žàL± Y¦8SìB–®–ñL±‹2âj©Î»�¥«e;S좈¸Z’3Å�Ì©N‚4IØ[¨½åÓ§Mî…-6¹!©O"Ðì„­²|ÆèÓƒ& Õíæ×'ùß”*žês§d²2„YÃ&MíCÎ2†§fË–ÿO;6wòl¾p&7ìW_à FixÝAÅ¡(3ÊD¥™¨\þ«Jfø4_£dj«RÔÀaý•-Ÿhp¯’c?[ñ Û‰=oë%ÛÓͼåÑóFìŠnýµ»·o�ß©¥?¦©\É:°ª…('µ¿ÿnóºÆúÁÌÄà¹ðÃ-ß«âÎ~X¿®pŽ—üvÞ*Í­æÑVb$ÌØ_n>Õþÿlÿí*%ÖE/tïîôä»9/fðGoõ‡ª�9‰gö ÓícΜ[ÉëÆj&�’c²VðëŠo½_| VÑÜà+Š+7Ó ƒx"qý´X{ò°~¯hR¨@úy;W®Ü�£[%}ªFnðŒ:ð&¬q�¿ wî$$÷§Ä#@#f ´6¥âØÅ„{M G!„mÚº-V/Ï.f P2j ^C~ÖXÔK+oÈý^ñ¼"yC5÷V`;l¡DªéuËc£hµÎྎ y)²I8U¤2‡Üw0ˆGQæìõ³FÇ1vªv g.¨„xû¿›‘1„=°{f’gyÅZ%ˆ ¾Tk(�V&‘û V ¥93©îeéÄNllADˆG2YúªKr_ÞYЃqSxƒÔ€>44ÄB=rްÆ)Niõ”]c®–z¢¶=ŠBZ5‘–z¶†y^A<‚êÙ&K‡>ÛÎ q1×¼¯ù5_;œÄ ‘�«‘ŸX@èµ*BcÑõ¯ViÞt,�)w¤ ÐÜ<û�pú­Ûãw�QmG€Ù à(ìQeål{0ß;}Š9ð»Îûaà%Ø—äKÛ�@"\f�²¾^LÈÀ†0/¼ûJúu ¹cOÚ4‘Š×¼Õ1¯SÓÄÉŒJk½¶Z‚QáV2¯W1ªŸ6ƒ ¤š€56]JV)›'ÆnM�ó6ÚÄ¥Ø »[a9ŠYQ$Ïít·ë”iäï–Š+œ ™àÓµ.ŽJJ }ÚêÆ×mÝÅQé ´ éÓ$+>�2~³ÜþAî»ÞþQÓëF§¡â¥ûµL‡ ýa±ª Üp¡º`î©ÙCç¤ø†»a«ëöntÊö ä al¡ž¯\‘{�A]©j�A<‘ª~V¬n½ôÂÓµÇN V®èšˆÎÛ†Ã_8êð „—`_’~ ¡ƒ¶—Ä#@#frIGë%NØîÐ*;IùiÅt._â„íNØ;ÓÏr¿‹AQ=p›¶îD.g_®šÐ¾ê¹Ì9\¢Û�G`I^ÆÍÈ,ô5,ƒ§­rßÇ EoÿrgnwHkW* v@øÊ�ϺeéÐw¶2¨f(¿gÂo÷ÂÑ�K·1•ºÎI�™cE)j›ýfpdD´SKœŽ/Á~Äã î&âÞB{&‰õ~àì!Qöë~¹ xöå ºÛäÿ p ö˜2í4®ÎTõÇeaÜô1z 8{J¡rb¶–�»«ÀiØÓÒ#tĆA<²Õ�ƒ#þ†N‹ùàH‹Èùp,ÇKV7ì§ÇƒKsrvÉ3,"èé´ç…7ëØÅ¢½LÓB9{aÑ.QÃ5"shü8ìãÂJß&›Átض�Áª­íœt4Þ~{xVnè´&tÎTØS…xT5]ù êò7~¸[1¢kÅ‹Jª"wõÀñ¢³æ�‘ (-¹§Æœ©#I¨ÏAí7“ú¬ÿ‘YÊsOÏýÀqØãé)™YºÈRÉmU¨Xɹ¢å×z¢JnÓ*{§ÓTr›¶ºº¤\Éë|{ZSÉoÕfÃá¿Q  êm“UrM¯[[Ïãn‚ áF7zg4æ"÷u Š�¹¤h0Wg+L %c­Ð!T?Öj‰ÆZÂsÔÄë4pöD:ã­vŒ·V¹ �¹:PðOÀ>¡dÌE¿Ø¼ûFc.òÿpöä+1æ"F÷€�`?R¨ž˜v‚Üݾûýô«rÿ˜A<¯Â˜‹½­âoј‹½:B~̵O6ƒ©*i`0å1³,’eOµ« ÕöTò³¢½T"Ôdz¬I×>äá$k�öÌ–Þ‘ê*m盥ÍÅ®éøq�³ˆß^àyØçÓSo7Û�­z»«P­z·„×»ð*·[«œ§¦Åš4Á]¡|Êí†Z wÃÞ-�%»FV¥J‰Á-T¢Ó <ûPzBí�8{²jOªêÖ²_‹ˆHµòìAÆ4…˜´T{´ÊÕì—d¦Ñ£t ¥f%"“­p¹L$Û€a_LOÀ:D«g+`½ Õ øõyÛ�ÛX³á JMÀ�°w&/^‚%Ü[þìÁÁ�Ò ¯¢.lž‚}*=á€Xd+ÜU¨X¸‹¶Ã-Üë�t…{b= T¸=#:¥ApÏþzÑrϺ€P �i•»¹%I¶MzúBÙÌÒV qùwöBÅ„m°…†$µñèÞ@^9�.à!ØB=,>9‘»vàa؇¥sjûê ·vˆÉàqØb ì§§®U¦<ÂX.†c:2‹VΘ-úbŸ·ËÅ<Ýcì …ç‰np <[¼ª®VVÝ�1^M‘ Zå2úÀêôðiŠÜ�Žj§#Ö¾?·’Èÿ%àeØ—•½þFk?Ñ&ÑEr­ý�û:ñ¤Mƒ½¸í[û9:„ î³ÚsŽŠ/ÀKZ&ûìBÞBk>GP ‡4•ûìèÛ€—µìöÙ‘ÿ+ÀWkŸ1z 8¥¥¶ÏŽÜ]f¸ÏŽÜÏ0ø í³coaû[´æÃÞÍ%¿æÓ+›Á~yÖy"Ly͇½*Ã!ñU¨vHÜàzþУ¼µj¶i©­ù�»z º5ŸÎpg¥†I‰› &ˆä×^àqØâ…hSL¾…ÛMò³Óf)¿l:+Üq„ˆß]àG°?J§Û±ƒÈ3ܘ_Þ‚}KI—ƒ~ñЀm¤#éÀYسҒ~]÷;ÎI›`”‹w'Ä;þÌÌ•)l„Ë/öO¤#ݦPº`.ÀÛ~ìïS&ÜàOÂþÉt„;ü)Ø?¥ ‹.rQâOöÏHóØa¸,I.ºA‘pìÊËÒ”%15^ÜŠ(^‡}=�Õ(–¾ùýÀA؃JJýbp\«l.NºT½‰/NÀžÈ T‘ÿÀ·`¿•^ÿ›¹r2Ëþ÷@ªíosì塜]æï~Ÿ&`�ûÿ“'¹«¶iëîÿÌ•“a÷»T^˜5šåó“ÅÕ ¦—›÷ë^×Ö †£÷QtÔOü£eºñ‘¦6ÊÇvà¤V‰ž—m1]&×F´®¶Söò5RwA ‡�Wa_M§‰ØUi""öÜÑ*Ù¿_[s‘­D 1ˆR@x öµä á ¾Hx¶P{-ÙB�ÿqàl±–J¨…B‰!̰…ªBµ-DU…CF¡`æ<“{¹™85;`w$/PrWì„-v›#û鱚­D”4aûP™Áh"ˆí>àMØ7³n"†!lÂ䚈½kšw iÊÝLË“À›°…’�¿™ØÃ6•7à¿x ö1%MýbðmØo'_‡ñEÂ[°…&ËäæòÉýmñ¤ÕRCÁ!̰¥8V…Š[Šyâ埢)ÐR§&`Š-¹«ªk)ö�è†^´ç¬œQ ÷Y¥¼ÿÏty•KÄöOÃ>-M°ß ·�ÒpfEgÛ-ÝÏE½’‹Üm³nW 1ÓŸuvD“kâ©°· ÷Z”~Ü Ø d5a6Sa,}ò8t«x*Œ~± ˜âTØ |‘PáT÷3ò(5VÓëF[Ì¢2|˜Ñ3r_Ç E °åñ’Q,×zý�xåhŸeF¯ ¯¡ðë×áš`9:Ô53ˆG2UÞ˜2=Ç2—L×o-ý±ÔB=Å.Io¿;ƒœ#d¶U(ê÷_ÛLtίÀ¾¢LÔ/ºí•¼¾ ƒ-¶¯Œý”‡ü_^ƒ-4‡¥þÚæ³Ð6a'lu—ß¼(ƒÎB©„5b›§¸,O ö{`÷(-?B;W‰Î ð4l¡®±pöèÀ3°ÏdÐ78Ë<çV1í&ꡚ–RÛ˜…<íóZXãDˆG™†ò¦›s¬ÅÕÊg]CJ 5"“hô�êh‡ò C”ê”ërп®¹44I#�ÕPi%Û"s2¥ã& À.Ø]"L†Í² G4tñ¤]/B ª)�=3tlÏ,~m­[kó®Àß°Œ‚alu Ë®JÃõ ãèÅD,#ZG€g` Uñ1£N¿Ë8ãV2­LÚ "÷çÄ#IãVÎ.¹žS¦þ¼[ÎÍÓD™åzaØš’ çyô`DæFÇ›s¶ã˜î¢]¢¨œÑÅðÜ]ÍK�á-Øb“Ñn/”Ü uY /À „-<‹Â¹3vTj+1nîƒ-¾bÝ/×™Å=ei3ÿs"!†=¬`Œ¤ $ì1àqØê7uï�Û¢Aäîú�_·Í£2û3ˆð%àÛ°…—ÆÖýò9à°?HG¶'€ÂþP�lyë[òÿøì�”Ëv·ü²ñ-¼D€ð$ì“éH·eTv͘H7»µÊuR äK¿X<[è¤9Ÿ|¯„™`4B’_òÚ2 ¥¼.�¸ÑüÜØb1«^Ðe�Z5"vïçaϧ×e�X2"ÆoÂ~¨L¼W�l+ñ^~ ûcùº—{Zˆü?a•½þÖÇ.;£ºnLEvLS9òä¾�û:ñ¤Mã*R BñÔà »Ï‚¦ØÄ£hÈ}Û*è}ŽùIÙrÌ;Æ‚?d3rf_ïÔôý[–göèþ'¦W\ÑGõ™©ãýýÁDZ²g/:–ßçüT?¨›Ï ªKÜÉï»]Çû¾ û]ešßö8o—zéCØ[h®ö(æ³ýR"š€p;a«[ôÙPDH Bu+>ü""ÿûÄ£, ¢Ì‰©žèµoh™6侎Añƃ$:/K‡zE Š_EÀ~Š˜‹•åk}Î,™Ž•sGt^‚“ȪIiån8A!“�67i«{«¥¦§6ì%¯s[Ü[eXÕ˜ŽèMd¡\-Ë~Ê? @þ»�=°{„¥Q#�íùÙkF +ýœ ߆÷ÂÞ›¼.Þ†;`wÈgÿ=>D ¸¶Êr#з!Ê·µÕ›ÌTÄ çèÛ( ok*â†Ç t›/P!uÞ‚" “8h£Î[P$a›¦ê ¥€:‰@;p/l•¥3F�Ìúº'uu’ÿN TáÜP� ùÙë†g̬,ò^*q’¼­%s OŒyÞ†$okkB¼¤.ÏÛ�%á~Øb•øFòÜêËSd‡å’°USe}Œ8ï@�„ꮬ'h¶Ã*%|â¼AÞÑÖDdK]œä¿Ø [¬�¼ ë9éN™Fþn©¸ÂÉð.DyWKµëy¢¼«eÜõ¼‹œ!L±ëy¢$̲ëIþ»€‰v='݇FÑâ]œ¹E¦Øõ¼EfÚõ$íÀ»ž÷ HÂ,»žä¿˜\×sW~ö–åz«›ôy§uîC™÷µ5�À’Vé}(“°[«„SJ_¥D ¨ÃÖ“Wé}(“ðìÒïÏ=5Jî{Ä“6�)¤@„жÛVfhW‹‡Ä,í4ˆMkª¶ÛÖÜ�#É•¶ö7{´JØ©¤‹4¹«êZ%rOÒ%iY1£´$ñ×÷3(>„aT^ß7ågÇÍR~†¢apR|1vhêo ˆÆˆ�PÝ-u=Ø”nó)ôTI˜åZùïöhI­%´¬Qè˜ãD‹µ/Íó!¤ùPS°%ïåeúÒ|¨­ ›—¾L‰€<[¨Fã“éCH“°¶|_€_¦äÿ ðìCIT¤×ÓðL‘Šô¨’0ÅŠô¨’0ÓŠ”ì¦X‘¾UfY‘’ÿn`¢)£P‘Šô]Hó]-ÕŠô]Hó]-㊔èÀ+Òw!MÂ,+Rò˜\E*¾øõ$I˜ââ×{�$a¦‹_D`/°CKmñë=H’0ËÅ/ò¿˜Üâ×v_ž–›Ú<ð¢|¤¥º¾ð¢|¤e¼¾ð y¤¥º¾ð¢|¤e»¾@þ»€‰®/ˆ¤xŠ$Lq}á}(’0Óõ"ÐLq}á}(’°¶‚ÒÉ­Nòß Ln}¡‰Ôi¹ž+2Lz U>ÖR&=†*k“#kS&=†* ³&‘ÿn`�–Ô0©98]1þ,g. \Rõdù´Ò$ª>‰~Y~UÔk*Î*HôHóhe¿¨Vø$údùd±IS²üÇ-Ñ MB]“Xý{ÑÉ—¨H´´!I‡HB’„™‘ˆÀ^`ŠC¤!IÂ,‡Hä0¹!ÒŽUyŠÌ2=�.Ÿh© y]>Ñ$†Èj”t¥† |}]öÀk]å4Jþu Ô$[bÛ?‚( SÆQf:Œ'�À‡ñA”„YãÉ0Ña¼Ø6AŠ$Lqo@‘„™ã‰@;0Åa¼Ef9Œ'ÿ�Àä†ñÛÃm‚–YÌón'š…(gµT«ÏYˆrV˸úœE®ÌÊæŸ@g!JÂ,«OòßL®úl zwã›&c(æ Êœ–êk…æ¡Ê|º ÍC•ùŒš‡*ó‰*�|0SÏ+P¢$L±‘7!JS˸‘7QBL-ÕFÞ„(M-ÛFÞD1µ$ù]ùÙûeÛ3'ófɳ ÷‰Ô”YÐR=¬R€2 ZƇUè§z€º–Úa•”I˜å{ú¥^`r[ìó³4Ñ$²à9M¶ÃVyb8FŸsÐ$á^Ø N óë“t¥Ž óésš$Twó¿>Éÿ~ ÔbÚ†úÜÉèSd¾~œÃ&Mm_,F¤óæ<§^8q$EJº�R�1>‘ÎC˜„:l=‘’ÿÀ^ؽIŒ–¦Ì{Ih{½U¦8Z² JÂLGKD`0ÅÑ’Uf9Z"ÿÝ@©ú¢f~Ú,åEVå?†& Slæ?†& 3mæ‰@0Åfþchòc-Ûfžüï&ÚÌWô)ÒÌ?…0Ÿj©6óO!̧ZÆÍ<è¦ØÌ?…0 u-»fžü&×ÌïE*ò¦]¦¸u¤]µŒ·ŽQHŠZª[GŠÐeQËvëHe¤¨%¹udw~öAé©y§hsAKõF…hsA“¼QAV§ È B©Ê„O§ Ð&áAØbó=r:%ÿ‡€‡aV®ÓíùÙwKì@r ¢$Lqú¾QvhNß�N`ŠÓ÷%ˆ’0Ëé{òßLtú~U "]RÊ´µT§ïm(ÓÖ2ž¾'=@]KmúÞ†2 3¼kŠÜ÷2ˆ'm‹H�ÕÜ5µ 1SÅï™ú¤“�RºcÊïAÅ×ÑRí¹“»z`ŠÑda–3cä¿Ø£%53¶%?{Õ*ñîcu¡ÂØ-É+Â… wÃÞ�EåNZ�{`«ÜÇ#Mr$lƒÝ–�4É;Pjï oí)š†Ö\œ=¨’°CKmYÁƒ* 3]V û€).+xP%a–•'ùï&WyR(»X^(Q¼/N†eˆ²¬¥:Š+C”e-ãQ\%¤¬¥:Š+C”e-ÛQ\¤¬%9Š«ÏÏN˜^nž“ÜôH¸¶P;˧Í%è‘°¶P Ym�=À6ØBí,Ÿ6— GÂvØ Nârk“üïvhq_Ô¼‹"_†*—µT›÷e¨’0Óæ�ì¦Ø¼/C•„Y6ï俘\ó¾K6Þø3(ó™–êØ3(ó™–ñØ3d¡®¥6ö Ê$Ìr +ùï&·…5¼EtUv²$LñN”È’0Ó;QˆÀ~ Ôþ>‰®@–„ݰQn‰’ÿ ®%u'J³Tàûç�åót%ú²|žµDŸC–ÏÓ•èsÈòyÆ}Y>OT¢2wN| Q¦8”ÿ¢$Ìt(O:�)å?…(?ղʓÿ.`rCyá;'>E¦xçÄg HÂ6-Ã;'ˆ@;0Å;'>EvÀVP:¹ÕIþ;�ÉÝ9ÑŒÓ~·,ÏtŒ"'ÇÏB–ŸÕRmá? Y~V˸…'û�)¶ðŸ…, ³láÉP×’já› ÑiϱJsœ?U¦8ßô9¨òsZÆóMŸCùœ–ê|Óç ÊÏi*相·‘|$ÂnÑ‚RÓëÖÇ®iE×®áù-¼ô÷Õl`áN€ï ËUñ–Ðê’ÙV;j'Çï÷Ÿ`ì…™”³KtílŒçM@¶ž~&‘û âQ”I-~&…‘¥E3èóÈÂ}°Õ 6Ê Ï#SÕ�¸3ˆÜw1ˆGaUíGãä÷dÊRÏ / S¾�m}™¡pÕüVÝT¾†Ïè¿Àkkš@ Oßh¢o4áWZ¿k¦¿{=üÑ�ß¿Ýx³ÿ™ÍC¼¼ê·y:¼è×-†g/ÎpÁ.æMÇÎ<¼2ÿô¼óôÙù³Ë¥'+O?ñJ O�Ÿ{¶”;æÿ7WžžòO3wÃS³eËÿ‡'Ž�?›;y6_8“öËÄð‚QæÈi—ÆP” e¢ÐL.ÿU%|z¯Qò¼Y¥¤�Ãú *S>Á¼>»¢;ö³¿��Ñó¶^²=ÝÌ[}0oÄ¿v÷öíñ;µtÇ´ìÚÀ*FˆrPûëðï6¯ë?=˜™<~¸å{UÜÙë×Êñ’ßõ úÃQÞl%fAÂŒýåfëoü¿¿P¥Àºè…îÝ�ž|7çE‚ þè­þPCµ³b™œ¡¬ärc5‡GÉqX+ñu¶Þ/°‹N{Ä~EquF2dO$«(V«ÖïMÃ5CÑçí\™Ö�Œ ïf•ô©5ùÀ_êÀ¸n-{IÖ܉Gî‡Ä#@Cð–ø‡ãSWkðzM ‡�¯áûõ!ò󊉕Œ…Z#±×�„»`ïJ?WÈ} ƒx2Ϫ¡·wÁJžš^·<6Š–áÆøÝlÑÖ´ýif ¹ßÍ EÙÒ5ezŽe.™º^Ȩ{A7ôOîsØŒÜ!<û�œò,¯X«mFî†}8ýœ"÷GÄ#˜Su/K'vbi ² B<’Ér`µ ÷Q8¸Ý�öG èCCCýÜ<ë‘e„5ö”H˦ìsµdµã[µ5ÝÄ´e³5Ìì â”Í6Y:ôÙvñˆ«X«Uï¼NÒádÖ�4¬µù™Œ¶TÏÜŽé|š€Í°›•ÕÌ4ç02²fúN€ß›À‹°/*ìάN¬o¯µŽ®!.t4ŽhïöÁî—wGa�JümºܺͽFC4.'`OHÓÙa¸~›î•�R8®æ$ÕJ2À°wH‰;æò(¨$vÝd#‚}À°O¤£î†Ñ mÒû�‡a õTjþrð$ì“ “#f©_$<û”|:$�®§Ä£ìí-¿ƒSr£Brö™ô{äþ,ƒxÒ¦±)¡xj£žÃ6Wp;.a=pl¡­&­^CÏÍŽ‘óLÇïÓ:¸î÷q<Ã*‘9}ÿ¯¦ [€'a«,Ñ1šŽ¦¹ OÁVP¢yÅDxšAá-G£)a2š~Í7qcÎú…¨HÍGÂk}A/˜¾¢]ßt]¿#a—tÏÖý¿›·ó®çíÀã°�'¯h¦ûô6i‚=9)‘û“ âQôö � g.˜-®5—µ ¯½SZÆRI°e B¹¡nƒ,f6Qr‚$fÛse¢$®s;'B•}½¶: ;éî\ ´Aˆwœld?mÑ�â²±�G\ÝÐ9sŠø´Ã›á«=7mxÆPÁ©LÏsñž†­²ß³w�Üž�-ßï¬З-ož·‰³ÀQØò£éãþðuÁ(Ñzð²/ÒNÎvò®¾l:¦^ “×~sd”ò:¾ÈK›‘wÐmÒ£5´ç‚K Æ… J­Ûù�)æ×u×äŸ h=¨^S3¿}Ø\2KºU`ÙYT6]¿ÃZ4õ%£X6y©î½=J©6ÚŽ>裡]â&ÔÑØÃ5IBÍ>¡ç¦cêâåÄ@g;˜Šj�-�ƒœ‹iïÈ×^-Ó^¹¯cP®Ð&K§¹a³hn¬¡1<…¶Ž)]v!ZX£êÁЩÙуf‡[B�È>ÂaØÃ¯F×…ÙîŸf×…¹âMa×å°?ˆ_0Ý a¤3 FPOÒqËÊÖ ÞÌ#Š­Às°ÏIS=Ñ·* �è6ks”˜îÒ*wÇSäõšÄ*ÊË—FæD�Ö»_EÕ¯NKº@ê¾<û˜rÝnÃ…@Bš½¼ ûn:šÝ:*v‹Q^‡}]™^ÏïÁ¾—Ž^�ïþ/­×�ºYrËÁd0U»¼.±™° iVÝUþpl^pL¡…Âî°(TïÀV\¸v¬¹°�»ˆ± ÀIØ“é±æQ™»‰ð›Às°…º 5ù0ð&ì›É4r×|öÛÒ’®ãî@“ÿ[ÀÛ°oKó˜˜ð†N¸¥.Xš/—žšùáEcÎ/\Ñ;ÿ;Û ¦ÔéKáˆ`u®�{~ ÅŽp¶ü‚×]ÓÔ9™èðNÈìŸ|•zˆºV9”¦ž_õ"ÑÝÜ{¿(íu¿Ü€= 0Ab*r·8[~/úÙšoóË’gåÊEà †ß½3þÿ‚Á6ЦQÔ E{¹WwÃýIܵ‘æaç¥ÉWÕQ}A“%=ˆí1Ò '³·RÑœAüÍn«á¶¸ (Ñ»üö‡éÐ�£Uä¨_¾ [¨q«ùËg€O`?I¾�’»cÀ�`”AkMþ à,ìYiÜS…½(5ª™@Õ6f!O›.È»Æ EâÙþ8oº9ÇZ\Ý¢ºn~•ê�L¢Ñ7ªOaÊ' Qªc�`�¸G–uÁÄ#)¯Ý3óþ(/ܲAã=êzr;‚D'”›[­'azüÖøµ™¸º)nž™Èt{`÷$_%’»V [—Τæ``™´ÆUä^Ë$.€C°‡¤9½Ñg•rÅ!ÝöMß¿µzÒà g‘Ãõ|þåü£Ðá°ßÈZODæ8ð l¡Eu>=‘»7�gaËoÞÜ1h­§Ñ4÷ˆ’ÈœNÀ–Q^3‡æ†tó™™+GZƒ1׳p¼èØ93_vL�õ£d-ú�øà«(¼/Òu^ƒ-Ôô­=÷¤-'fœ=±¦Hô]“w¦Ç§fôÉ;3wé–>5>ó`êÎä�ú› cŽ\ÅíÀ>Ø* –Lg6Æm„Œ-™Y¯õsw7ÉùÀØBCâ5DÆflh߬%û FÍÛ~@·TªV‰}#LÕª�Á“~�×Ë.·öß„wÂäæ…ó³ãaúr:‰X—¶Zcý0�A'�&mÒ»€�°;EI¯ûåF`tÈ&…UCr·U“òÿpóMš7×Úi7™ûJ7[¦í³²Àoe¹»›ƒàBØ¢UÆc’¼ÞvË‹‹¶ãÕhü×ô;»<7ïãê †F49{aÑÿò¬U´<îÂK¾ [~Qâ¬c®]r‡tý-{Ùô½�`ßm§7ü ßõ»4W\Ñ�ü’E›ë=[÷ëV^òà Lx¶X2¡ºõ˜N„}P„`šu+‘m¶ÁnSR·Ò/ÖÁVwKBlÝz Ò T·3ó`Pø6*±Ü•/<| ö[ÊÒgëã¼éV±Ö)‰(Y¢íÀí�$÷u â,Ðô¯kèÖÉ5{بÓiòÑ>¡…“T„]°»D˜F7œÈ%ÑÐÄ“vþ�„t"T#£ÉéòlpŒÞ `‹Ÿí7)Ž•7×4†4„]Ý+4ºX¢/¸Ôä»Ô¸ÚÞ×a{'6i‚{'Ö¼Nç¢éøU‡_iäüÿ¢g-XÏ ¡µ¸ÓàDÈl‹UV_¸ìå ëôFÞÎ(Íhn½‘û:Åë )LßC256ª¶š&üÊ›†Ë ~3Ç[_Ñ4V° ¶P£ÝÂ$—bD£ƒAŸa�5=Gˆ'�œ2¶dδ®ÖXn9—3Í<ÿ¼±¹ |ûAúÝô«aîVP¸›Î=Ü>o×d=Ë%¹¯c0£áöu¤@„É ·[Çòy‹òÃo¶ª.˜yi¦~éFÚ„ò³„Ͳ G4tñ¤�ȳ3Ró ¸¾¡”Æí¸/ØÅ¢½Œ±#åë^Ôa£úј‘“q·‰°FD‡,{Dé$ðìKÉ·Yänxöe1ĺá•ѸdlI:oöùOk�f´Íµ«½º‘sl×]=âÎK˜™ÕfwªÈN�Ýg_ï¬Ö¯_�ÔÝE3g¬\0Ý=ÂKö&ÊM��üwÉÖ´\ÞÀ øže¢£ÅJ?æn·[HB¹MukRAçL…[Uˆ'³Î3ñhbOÒ¹«6ÚeX»—Uïý#þ¸™»t™À.ØâÓuÜ ½ UÞÎV¡·«P­B·§Wã:†±2½ i¶h•+O“–émH“p7lù«b™ dN+°v·²Ìyý΃[·D²æ0°v ;É]°v¿tÖÔqWäÿ  Ü@¡JãN˜�fXiÜ©Bµ•Æ6kaÁÌ[FìÞ¬XqŸ&`�¸ëI‰“ÜÕÛ´uq×Ó¯7ˆH»¶z\¶]Œœ¢®Þ *}Àh÷p ªä®8[~B•¿Þ ÿƒÀ!ØCÊ^kP_XÏk¥@´oõ.0£ùr_Ç ž´iÜC D¨&5Þ˜¡MU eºOÍŒ6W7�Rh·üê<÷äî}p$”;Ç~:9mšá Ó옳7¸7µ÷!]Y¹!<ŠÍ‘Á=ßó¦åèAð$î×™Â+2£ë´U0 צ7W=o3Ù–Æ”À3*��&´5l�È9)>Ô¹ Â6MvkØÙ# âI;ãÞAfE˜‘Œß…ëw³¥ñ\¿§”ÆŽ1=¼4�'©G B¸öu}tÇ^~B¼¸Çö�P�»a �iù:‚�ðEÂØ=Òyt�6gxÁ>޼þ¥«ÉÃñaæq7‘DP^…}5}M¿ÉD¨FÓ¯Ïð¯ë<†wB5gD×$ ÷*ñhdOÒ&w›�Ûa‹Å_d?=Ãl@[I3¼š:Ü)EËÁEûžM=[\¯Ï­iâܼ [^ÓÇ& º½`y~Ù©Ñšâ‚?`¶éJ¬èæŒ`ó‹Àñ@l„Ç`“fý¦ß›^°S�"8Ì…à~>XNt;w2’„êÖ«ÇÂ+ÿI œ„ž€ÄMö’ýšÑ‘&KB-ÀV­?DYÙ�‰Ëñe–pl¡y©ª…X™ ¬”�6 T¬¨F%‡Ä“t�Jîz€G`‘Εö5›Pqv™ÿä‘: …=*M®7ŒRtí5µN¡\,ŠÖ9… °v¯4Ï›~ÕT’aã3Oûx— «hÌÍ`í< ôÒ7»R¹/Õð[)[/úÉ� %T>xßÇÀ;2Kꙕ�Y-œOŽOÒec¯NÅÁ–�~² *ªL%­U eH�µ]öôeÃ)‰ìö'ÂÛ€`_P¢ÇJ\—@€m}vƒ®½QÔ˜c;Çjœè·üW£÷㾂 ‡ÄÏIë‘ý´Þ[YèÇåA ¯Éž^`?=>õÝ æ²ßç¬Uæ}©,š:{¼´MP%<û¸4í¶’©48Øäºe�$-€alùµ#îáÞ\G˜ÝpoÞ Õ÷6x+aâÒÜ¡U‚_'] “»ÍÀ�°wJgÊðjÅ �˜nü…ã"· Ù]À˰/Kå_Í9ÝëW'GFò³W­Ržûâ¢ö.0;ŸÈ(`ýÅ#Ä;¤-@úðl¡mþ5yhÂ6ÓQ÷`vAZÝÍìrwmL\æ€l/ýÚØ _ÁôÖ§ÂÛDzžå€Ü×1ˆ'mO‘ªYŸz­º#±f}JtP_ÔÂÅ)ÂØ=ÊÚMñ=9ÄçpH«ÜE›tíBîtà0ìaim«´�¹s x¶P¼–@A{e…M4.0ˆ'íòµ€2aFµM ®KÙÒ°áÚVJC¤¾ï„êûàâu ñiî†-´A—¯.!w›�­°…f�×N†°g?ƒYBWÏ[®ç÷ÄË–Œ‡gMoÙ4KzoÞrü&»—WQDxðìÒÄÏ»„Ó)˜ù^}ìÞ$M|L' „g¦�YÃ5õ¼c-ùc î®Ø'ÐáØg¤¹o½‡±' åæÃj•ˆ�•¡�ê3SÆy ÑÚì†�¢:¹Ûì�-Öç`?=¬M#¬9®¦ËšËÁýˆ¢¼ûº4Õ¸#ÈY½Øp@_²ŒpsJ-½Ï*¬.P) ¦ ƒ²Áµ ºÚšƒš’/³=‡„H¶œŒ<° Ü[luZÙŽc¢²Ø[hf�¯L�»&`;lù[•Nê ¦QBx’5FWþåæmÛ¯l—ý�éBY’¯¨ˆð^àMØò3Í׌§ØRÄvÍ’kVÆ8Q+1ì<¥2â˜EsÉ(yýºç`/ï‹”¡?Buwû_ wõPYÆ�QËñ_Èðür¿èé…`ÂA /rpÝB¹H[hmZp ¿ÂûKàNxöUé÷…b¢5ºK~ÁçkÌáªy·<7gºÞê´`¸¾áP]Æû Ë M8 [lSmGò™.`#ùºá’àY娘Ðm¬t$¹"² ¸ö>iBÆŸt‰l¸u|ÑöeDk8³æ¼±dÙŽË}¶yiExöa5ÉÔžka#!A:Z¬Šb�}Š Tw¬#8ƒ5+踷:}Ê`7lu»K¤»ÊDë0ðìSÉ}r×< û´|—ͯ¿=Ó)+ËÄä p ö˜p>Õ˪Ϡ E˜r¡ú, Òg•ªó~ "DûVWׂ5mº·9?²zù$âÀpoú,ƒ—`_J/õ>‡ûœÒÔ;´&õj'oB}ŽÁ~Øý Õ,«úïƒÒ#LYõß�¼ú~¥ùÆ}žøû«�¢&Cð"ÓlÑR»„€ÜÕÕ]Bp<¸]iÎZ2K#~ןbÓ¦«¨--®T¦$0"ã2Ñm^‡-?¿22kæ Š+F„ ¯Æ­˜¥Õk{Ö ‰=‘€pŸ‡ú ™§IpÛk™»5ÍÝmù¤@Ø[hZ�O�_@Rî…½W:[Ûõ>ï“ÝÕá'÷¡j"Õ†=œ^åùH +ϨÂW¢ò$2MÀ+Ï@É TWyêQŹ®›¦—Eˆ]+ð$l±ky“©kˆ×ð&l¡™@þÌ;|¶|´-î.¹¿Å EoßðØ,•L§2iµ®;HÕÈßf´MîëÄ“J|¯ýw³M‚¿‹×ŽP8 ÄÚ–Ä›¾‚s’^*ýRæG”¦ÒE½78n{‘B}n97O÷¹¦ç…gïrv©`Í!Ûì’Û?.ˆrŸÕùÇ`‹ÍJ³Ÿ¶¬›Ð9yý(R“°¶Ð€&™U ¢Õìƒ�µŒän7°¶Øl*û©¢é"õð ì+)õb¿‰ü˜–i/–Ü×1˜r/öÇñ愯ö²À�3(¿,Ð(›oO ØSnlÿ>òêï+Í7î™­¿_…¯ÄÌ‘i¶h©Íl‘»z º™­£ì²À²amy°icµPÑvF�ŒkŽÀ–›LW~�¨MŸÀ~¢09HdoïÁ¾'JzÝ/�?‚ýQ:ª¾4`é7“ä~–A%÷]äß~ ûãô[ů‡¯ šÆ¹çnp»Íõ«“˜r¤›¶æÌ’éX9¿]â%ù #ì�Ý£¼hï^Cw0W4ܸõå8¢¿­…-çoƒh“(Ññunë�:l=ù¢ôÛÈ Â°È%îM¾ä¿xöAayÔÅÈ£)?;¶¸è7þÁD0'Åß�;`w$/Œß�;a |ÖæPlÓ;ü û€ûa«~Ä*ôw JÂ.Ø](”üw{`‹W`q mY£Ð1ljF¤/Íów!ÍßÇ&MíÅ�12ý]Hów‘<õÂÉ#)S" ÀªÑødú»�&a/ìÞ dJþÁ[•zAEz-ˆq)R‘þs¨’0ÅŠôŸC•„™V¤D`0ÅŠôŸC•„YV¤ä¿˜hEÊ(T¤"ý=Hó÷´T+Ò߃4O˸"%:0ÅŠô÷ MÂ,+Rò˜\EÚ�Ÿ½nxÆÌÊ"o-úû�$aì¶äåùû�$¡Ô­3²ò${�°U¶"1òü}H’°¶‚V„[žäPªÙPžÛÙe%N†ß„(¿‰ÌiÒ/ âè7!ÊoBõ¢º�è7¡�o"w:5Áe#>�~¢ü&„±IXr%ÿ]ÀnØBÍç†Ý&:)úP$áØBëÒ|êü(’° ¶P­-«N"ÐÜ [eéŒQç@‘„°”Nnu’ÿN Tá|Ñ0iü™åz®È0é[På·´T‡Iß‚*¿¥e•þK(“0Ëö俘ÜûÆü,M4‰¬wþ+h’P*L6Ÿ>ÿ4I¸¶|<+}�`'l•‹i1úüWÐ$¡ºÓÍüú$ÿû�Rkiês'£O‘ùú aþk0lÒÔöÅbDú¯!Ì�Ä©NI‘�n TgŒO¤ÿÂ$Ôa눔üöÂîMb´4e.ØKB»ëÿ TI˜âhéß@•„™Ž–ˆÀ>`Š£¥Uf9Z"ÿÝ@©ú¢fžÎÐËžœÿ-4I˜b3ÿo¡IÂL›y"ÐL±™ÿ·Ðä¿Õ²mæÉÿ~`¢Í|EŸ"Íü¿ƒ0ÿ�–j3ÿï ̧eÜÌ�n`ŠÍü¿ƒ0 u-»fžü&×Ìï�»ˆäÏ K·ŽütùgZÆ[Gþ …äÏ´T·ŽütùgZ¶[Gþ eäÏ´$·ŽìÎÏ>(}"5ïôçÐæŸk©^¨ðçÐæŸk’*ÈêôÏ‘A„R• ŸNÿÚ$<[l¾GN§äÿð0ìÃÊuº�½á—“ῇ( Sœ¾ÿ÷%a‡–áô=è¦8}ÿï!JÂ,§ïÉ0ÑéûU�ŠtIÿ”ù´T§ïÿ”ù´Œ§ï‰@P×R›¾ÿP&¡ºé{î;žÈ}/ƒxÒ¦ñC DˆG’†^5\m옌sÉ(JÜ5õ€Ùÿ¡É#6*Ñ[„výŸZXt [4õÑ‹bŠ1¹«ª‹^$PŒ‰@+pl•;6cŠñÿ ¶ÁnË ±!ÿí@© ›/¼ž¥hN¸ß†“â„* ;´Ô&�ÿ#TI˜é2ØLqù?B•„YN “ÿn`�–Ôr}~vÂôróœäþôH¸¶P5ƧÍÿ=¶ÂnÍB›D`° ¶P5ƧÍÿ=¶ÃVpé·6Éÿ^`‡&qçNjƒ�6Ezéÿ¢üÏZªcÉÿ Qþg-ã±$è¦8–üÏ%a–cIòßLt,¹*ÐkóåH/Mó¿@™ÿEKu,ù_ Ìÿ¢e<–$=@]Km,ù_ LÂ,·‚‘ÿ^`r[Á$OÆþWè’0Åå�ÿ ]fº¼Aº€).oüWèò¿jÙ.o�˜ÜòFs~ö-ýfSÜ ÏäËÿdI˜âõYþ…–ñõ�2òZª×_üdùZ¶×_üŠÈ_hI^!±Õæ¿A“„)nµùoÐ$a¦[mˆ@0Å­6ÿ š$Ìr« ùß|u·Úüwó¿k©nµùïæ×2ÞjCº�=Zj[mþ;„I¨Ã֥ߟ{A�Ü`�¢·§(Ù¦Qtíž /ýÕ,ep'Àÿ­ â,¤Õ…³­vøNŽÿC c[ýH´A©D·ú-Ñýc1ž73Téÿ€2#ViÍLj�Yøâ$ù—È™¿DZ5ˆ¦w.ý%ræ/µL×HÉ}/ƒxÄ`Ý·ê¦ò5|FÿýßñÚš&P‹Ð7šèMø•–ðïšéï^tç÷À�ÔµÊ5í‡xyÕoS^t¬%Ã3‡— g¸`ó¦ãç?^™zÞyúìüÙåÒ“•§Ÿx¥…§ÇÏ=[Êóÿ›+ Ï Oy ‹'Œ™»�Œá©Ù²åÿÃÇΟÍ�<›/œÉ ûµ×ð‚Qb‚LE¹P&ÍÄáò_UrÁç÷¥O_•”ë7¨Pù óúìŠîØÏVüRvbDÏÛzÉöt3oyôÁ¼» [íîíÛãwj �i>‚HvÀHQjþÝæu�ôƒ™‰AÄ7Þò½*îì‡õëJåxÉoß­ÒÜjæl%fAÂŒýåfëoü~®J‚uÑ Ý»;=ùn΋üÑ[ý¡†jgŸ¤–ËA?²’Õ�ÕD%Gd­Ð×Ûz¿Ø,ÚaûÅ•ii�A<‘¶þ‘XÝzâ°~¯h®*?oç‚@ãFÐK°JúÔúÌà/u Mxö iêÜ)HîO2ˆG€†Ì,çÃñ©«5Ƚ¦…CÂ=°÷ˆ�‹éý—Œ…Z½ÿ×�„5¶C¤•5ä¾�A<¯FÖP­½Ø[(�jzÝòØ(Z†ãw°ÆbkZyCî÷2ˆGQÞ› »»¦ßï î„Ñ Ž½ ú'”]ºáêFIrM·ƒk�8ÙoF†ž…}Vaæy–W¬U°6#ÃÏÁ>—~æ‘ûó â̼º—¥;ɱY!Éd9RUÀ)îyi@w£5úÐÐ ôzäáØGj§ìsµ´5÷[µ5]Ê´µ³5Ìñ VÍHpjg›,úl;ƒxÄ¥¬Õª�^'ép2k€FÖÚüÌF[ª§Çt>MÀfØÍÊjì¿w<2²f>I€ß›À‹°/*+WOn• K´÷û`÷‰Ò_÷Ë;€£°G¥ þ6´œÜëDãpö„4�~›î˜^Ù)…cpNR�¡$Ü{‡”¸cÛ îÐà��á ØB£~uShðkB1šˆì~àa؇•hš~± x¶Ð¨+&9b–5ñEÂS°OÉ·¡CézšA<ÊÞÞò;81%7*$g`ŸI¿AîÏ2ˆ'mÛ‘Š÷§6ê9lsÏoÖwÀªÑjÒê5ôܼá9Ïtü±c•æt¿�ãV‰Ìéû·x5MØ< [e‰ŽÑt4'Nx ¶‚Í+&ÂÓ —h9ÍH�“Ñôkþ¸‰“£àp^0DEj>ž[ô½`úŠv}ÓuýŽ„]Ò=[÷ÿnÞλ"œ·�Ã>ž¼¢™îK–ó¢äþ$ƒÂó¢5½6<6œ¹`R¹Ö×6¼öNiK%ÁN”�冺 ²tviá¨;BñY’˜]ãkgKâz¸±#Tã×Ûµu±_“êÓµ@ „{a‹ÍD²ŸöëFqÙX‰%Á„c8`òÛIÓÉY³E“êCçÌE¢Ùƒ=¦,h³ÀPÁ©Ìësñz xöýD(ëÜ^NÁž’νú}ÙòæyK‘˜¾û=i2Çý¡í‚Q¢uåeWƹ9ÛÉ»ú²é˜z�ŽjøM•QÊëø"/m!Àã°…ª5´çìby¡0.Á-héÏoh1'¯»&ÿäA+è†-4¢\KÕ\2KºU`ÙY>qÝõ;³~9]2Še“—êÐÛ£”j£íèó~ŠÚ%nBÌJ;ß!I¨Ù'ôÜtì@�C¼œ˜(¶ó©¨ÖØò8ȹ˜¶}–=r_Ç \¡S–Nr!ÂfÑÜèвkÍÉðyo¡ÈÉŒöWo2Óõýÿ�(£óž·èŽ ­‚™[ÉÍ!g°hÍÙÎܰáx–ÿ7î°?2Ÿ3Ý!z›ƒæ³EÓ±‚M±¯³L¯´x¶PÃùR¯ÖYy¥A–ó�»4'Àû1° »¬lHÖecÝ¿å�}œ!ûÁQªÏ€? û§•Õ2õ� Ö\Ù©UÍ�ÃàÏÀþ…�¢ùàK5Ýîþ,쟕–ÔºÓMk3E Dÿ2ðk°¿¦0O\ϱKs1ŽøuØ_WèØ/_E7N ›€ß€ý�ôÛrÿÛ âI›stEa |b Ã-¦'g6ØøÁÝcaÎKN¯$3ŠfN›¤9ŠîBRªEöË ¦ ÆüLÌ›#è›Ó�ÊÊŽBÞ$ŠÀQØòë¡'ú–ç­Ü¼îÎÛåb^_¶�§!íÛõôY#÷Ô,åÝ~_˜†§çŒbÑååÝ�díV¦¼š ñÕ®¸—*{´Õ‹Ça«œ÷Ü`©rרäq1âÜìÒÖ]] ±bÙƒ²ØƒÜ«Í=¾rÙ¡ž„-¶=•ý´~€*Ø’.�º§€#°G”+¸™½¿BH½�9عtÔÛ4*q5 ñ½œ†=­L¹cÀ<ì|:ʽ4a›ÒÊÝ9 ›%·,XRUÌ[ ›° [hÔ³†UwÕÄS8u\pL¡Í,zX(d ÅÅlÇš[à¸Ë™Ž,%œ„=™N9k•¹ÀŽ¿ <[hnÍ_> ¼ ûfòM×VÛì·a¿--é:îž5ù¿¼ û¶|Ñš°�`9—J|8 X]çåž>€ât@ºh­ñ暦ÎɤÞ ™=ý¯\o�øž†­r¯R’½Aâ¼K[½W}—¶æä©DQ§_lžÑ*[ª’.êän3ð¬V9¿ ߦZ%*Už•+ ‡·P›sÀ°oH³:OmjïŒÿ¿ªÐ…¢?ú/øµB8àzŽi,¸½ºîÞå®·˜ë›4ÑÓì§To�4U]ÑAšÂß(X¥ÐêŽC`IXãD©¢ºcûê\w­AÌ&€÷a'³š¼®Öh]å-Àú<ðìkJê úÅ“À)ØSÉ×än8 [hP!Ù5 ÿ3À°Hóàž³d–q5us–ÚÆ,äiÑÂíâQ$ží�ó¦›s¬ÅÕ3ë)¡ŽÊ$}£úù„!Ju â¬÷ÈÒ¡=ý â‘”×î™yHîa¤Á%µ|œÄú‘è„Ìf‰öbÍ·¦Ço�_›‰«›â&º‰L'°vOòU"¹kê°uéLj†&–I;ŠÜxˆËàì!iNoôY¥\qH·ƒÍ±Ó÷o­}tÃiìpoÿ¶7 ¡7ÖÚÙꉈž��B—œÜ½ < [¾K¾cÐ(ZO£9%îa.‘9œ€=!Mêš9474 ›ÏÌ\9¸ "X™s=Û1óú¢cçÌ|Ù1u±:Œ’µè�'‚¯¢xð¾È›Pá5ØB=²µ—¦iËI…éh³ç¸‰¾kòÎôøÔŒ>ygæ.�KÖ§ÆgLÝ™¼sCß`·}Ì~ ¢¸Ø[ø,b�¢°d:³1n#ì×*U›df½ÖÏÝÝ€ôÖÚ’DÆflh߬%û FÍÛ~@WUªV‰Í’ƒPál±­Âk¼•]níÁ;ar“U�ùÙñ0}¹Ç›D¬ xöÑtÆ›t¼´HïvÂî%½î—�Ñ©S•@L[Hî6ûaËWüÃMòÿ0j›ßL¸9Œ’¡šáfË´½`V6$ø­,wwó¸¶h•ñ˜$¯·¼¸h;^�ÆM¿Ó±Ësó>V5ÜÙËìq–¡7i¢ËÐ짃oÙ˦߲ »;è™á×êá6´âŠnä—,:RæÙº_�òR>š„LµþêT 4!Õ<û Á4+P"Û¤­ž oÒ$î`Z÷ËõÚêœ]}ˆIW Ì…gsKî"H�™©)Eé³õqÞô «Xël`’%:ì›ÑÎr_Ç ÁMÿºV�n�\³SŽz–&ïÅ$´h×ì‚-´%*`øºl �Aà›°… Öô`Ëï³æ¯7Èÿ p¶º‰ñ­A}a=¯•÷ Wf8d#÷u âI›Æ R B5©ñÆ í’Y(Ó5\f´[&¸,™ÂWæW‡’ÜógÀ‘Pîûéä´i�úÞi¶Gß\ñÜû�n´­V�óa·[®`Þ´=ˆÇý:ñ „Ì\PÚ*x®#T£‚×gøçÞ…wB5ÇØomºß¼U5qiîÐ*«’®ªÉÝfàNØ;¥3e¸RøtƒfvÜø›ZDî9 ²»€—a_–Ê¿š»•‚ÐuùÙ«V)Ͻ†÷.óäWQYvn´ošx‡´Hß>€-t¿æ/OMØB—~ñ«û °» ­îf¶ræ®�‰ËЃí¥_¿*¾‚é-ÎÜ„·G²žå€Ü×1˜Qßè}¤@„jg^«¢Õ¶¦ËèW`>�®oöÀîyF Äçp¶º~~líBîtà0ìaim«´�¹s x¶Ðv�‚öÊ ›h\`OÚå딩3ªm>„ë³¥ñ®Ÿ(¥!ÒÿÞ Õ÷ÁÅëâÓÜ [h:š¯.!w›�­°[¥3æäj?§0]=o¹žß/[î#Í}ë=Œu8ÙÌ‚aÌ]]·�•¡�ê3SÆy ÑÚì†-´,ÂW0ÈÝ6`l±>ûéa½hyWÖˆ£tYs�‰ß=â•QÔ�×a˯«ßÀgõ\怾dáTJ-½Ï*DÅ<,%ô�°lðß•‘ƒsÚš�\’/³=¸·×ýs2ʃ¡Ü6æ—ò\ÎtÝB¹HÆ6… ¿Âûp'¼ ûªô{ŒB1ÑÍçtßÍ‚ÏטÃu8nynÎt½ÕiAzלíP]Æû s M8 {ôèHÎkáš$áM"P7_Ý0�$˜¯üº�•Ž$wCBDv÷ÁÞ'MèÀø3ƒvK‡ %‹¶/#м:kÎK–í¸Üû¤,¤áØâ«·Òû¤>ÖÂF.B<‚t´XÅlyxŠ T·å¡#ØÏ5+è�0ÎÔyÊ`7l¡¾h2]e¢ux ö©ä‹>¹ëž†-t%ûÚ.›_{¦S2ŠüX“3À1ØcÂùT/[¨Š(H¦\¨P�”ªó~ "PX*»ì±ñî­(äýÈêÙYÜUÇ}Nz�ÁK°/¥—z%¤XIiêZ“zµ“Ž7¡J öÃîN¨fYÕÛPz„)«~yµ¨4߸wÏ-V!EM†à–["ÓlÑRÛrKîê�ê¶ÜŽkÌYKfiÄïúÓA3¿:½R\©LI`DÆ+d¢Û ¼[~~edÖÌt÷exkmx#n�(­Þ:0°fHì‰\Zû ÔO(w?]Íã(l¯ebìÖ4w·Å�S 1é )Õ…˜l×ûh¼OrtW‡ŸÜ[‰Tpöpz•§‹ô ̰òt«ð•¨<‰L0ÅÊÓEÉ TWyêQŹ®›¦—Eˆ]+ð$쓯P]C¼F€7a ÍògÞ)àÛ°åc¢qwÉÈý-ñ(zû†Çf©¼`:•I«uÝAªF<`F+Ñ侎A<©$A¯]Î6 Êxí…“@¬mY›¾‚sÇü¤l9æ¿¿î.9³¯wjúþ-¿«Ñ;à·3–éW0©Ô¯9¢¯ÿzå>óõÿ ?b�•={ѱJ^ß§úA¿É 7wOxã‹H€/®µ’m�óvÉsçíå×›€_‚ý¥ää¹aüƒx$yôÔ§LšÖ\ 7pÑÌl�£ºgÌc÷rŲdR(XÃÚ¤©8×w,g—ô‹ƒz~öZs§B ±¯@ïY0lge¤7v¾/–ö�€*á1ØÇ2Èä…ïÕTɇò³ï8~*ÍP–öùié'Ö‚—3×/·¡ÁŸd?z„‡`’¦:X}ûrÈvzüÖøµý }bêîmPÈæOÂAØB}_Élþ{ð¡šlnÉÏ^·\D¥¢„ãO ¿2„-°…ÆL5�Ÿí—j~B k~ÂNØ�é´?�Ä Ü[þ¸¿rÈÿ~ñ(K‚(sb:$ôÚ?©T´Üý4r_Ç xw‘$:#Kç§´ðœÅo¾f?mš°½¼è·È¦Ë}céO#s›`7Iâ˜{ò§ÍR~::½Î=�Jô€a E„‰™ŸÙ`uçhyê�À~Øý¢Ô×ýr+pö¨ÂD‰™´"wÍÀK°/I«xsp6[ m/¯Á;ƒ½‘z%b§±ÇÀìB:º��Ndï߃ýž2ÅÞÎÁžKG±×�ó°ç¥[Ç}šü[À�aœ~«ø3¡Æ+¨¦qî¹Ü\pýêäµJ¬Ó(ˆß.ñ’üY#ì�Ý£¼hï^Cw0ÐÍIôhaËù@´I”è ‹ø:·õ@¶ž|QúÈ Â°È%î \ä¿xöAayÔÅ­ýægÇýÆ? sRü‡aìŽä…ñ!ÂNØBŸµ9ÄÚˆìnø«ÐUvÁîÊ@¡ä¿Ø[¼‹ShË…Ó œ<Òü9plÒÔ^ê#ÓŸƒ4ÉS/œ<’2%:ðl¡�O¦?iöÂîÍ@¦äÿ ðl±©¹T¤×‚À¦"é?‚* S¬HÿTI˜iEJöS¬HÿTI˜eEJþ»�‰V¤ŒBE*ÒŸ‡4^Kµ"ýyHó経+R" S¬HÒ$̲"%ÿ�ÉU¤ ùÙë†g̬,òÖ¢ÿ’$lƒÝ–¼<ÿ1$I(u£€¬<‰À^`l•­HŒ<ÿ1$IØ [A+Â-Oò¿(Õˆl(Ïíì²'Ã_€(™Ó¤ ^Á'Ð_€(º¨Õ…¬@ ùäN§&¸lÄ'Ð_€(ÂØ$, 9�’ÿ.`7l¡æsC�n�ýE(’p�¦>Ä]Œ:Š$lÓT…¸P'hî…­²tƨó¡HÂØ J'·:É'Pªp¾h˜4þÌr=Wd˜ôKPå/i©“~ ªü%-ãaÒ/!kS&ýTI˜å0‰üw{´¤†IÍÁž›ñg9squ§èKsü2dùeh¥IT+|ý2dùe¨¢^S±!C@¢_†4¿ ­ìÕ ŸD¿ Y~²Ø¤‰6­rý2¤I¨ÃÖ“hâ}‰N– 6'½_†" SlâŠ$Ì´‰'íÀ›ø_†" ³lâÉ'0¹&¾auÓ"'¿¯@’_ÑRÀ’üŠ–ñþ+�åW´Tð_�$¿¢e;€ÿ dI˜è~Ò�2�üÝR‘W ¿QþŠ–êþW Ê_Ñ2Àÿ ò+Zªø_�(EËvOþ»€‰à'݇FÑâ=ÕüO HÂ[÷EfÚº�v`Š­û?�" ³lÝÉ'0¹Öݯ>oùã÷ Ë,æy7ý*Dù«ZªÕç¯B”¿ªe\}þ*råWesˆO ¿ QfY}’ÿ.`rÕgS(л³t77¯B ªü5-Õ¦_ƒ*MËx†é× Ì_ÓR�aú5¨ò×´lg˜~ Ê$ìÑ’ša‚B§‚ÀQ¼ ý*TùÕtúU¨ò«Y+ô«PåWÓUèW¡Ê¯f¬Ð¯B•_MT¡häƒ9z^�þ:DI˜b#ÿëå¯k7ò¿ŽòëZª�ü¯C”¿®eÛÈÿ: ȯkI6ò»ò³÷˶gNæÍ’g,Óá¤ùPæo€b“¦vž:F¥¿eþR§^8u$UJz€º&1QͧÒ߀2 ³Ü\Oþ{�Ém®oÌÏÒD“ÈRç?…& ¥¢ŸòéóŸB“„{aˇ)Ð'èvÂV¹Ž£Ï Mª;ØÌ¯Oò¿(µŒ¶¡>w2úÙú›æo‚a“¦¶/#Òß„0‰S/œ8’"%Ý@©ÎŸHÂ$Ôa눔üöÂîMb´4e.ØKBëÿTI˜âhéŸA•„™Ž–ˆÀ>`Š£¥Uf9Z"ÿÝ@©ú¢fžŽÏ‹¬xþ4I˜b3ÿ[Ð$a¦Í<è¦ØÌÿ4ù[Z¶Í<ùßL´™¯èS¤™ÿ„ù5-Õfþkæ×´Œ›y"Ð L±™ÿ„I¨kÙ5óäÿ0¹f~‡Ü$_‡. ÷ÁV9ë£Ñ¯C—_GѨ-²ý: É×5Éi>�~ºüº¦ò‚;~�~eäëšäɬ 5º;?û ô‰Ô¼Ó7 Íoh©Þ¥ð hóšä] ²:ý2ˆPª2áÓé7 Mƒ°Åæ{ätJþÃ>¬\§ÛÙ9þ6DI˜âôýoC”„Z†Ó÷D ˜âôýoC”„YNß“ÿ.`¢Ó÷«é’þ”ù;ZªÓ÷¿eþŽ–ñô=èêZjÓ÷¿eª›¾ç¾Þ‰Ü÷2ˆ'm¿‹ˆ�$ =¼e*¸~Ø /#6Š×Lýs0ûçšì0b£½E(ËïiaÑ%lÑÔ¥ˆ)Æä®¨.(…@1&­À=°UîØŒ)Æ¿¶ÁnË ±!ÿí@© ›/¼™¥hN¸ß†“âïC•„)N ÿ>TI˜é2ØLqù÷¡JÂ,'�É7°GKj¹>?;az¹yNrß„ wÃªÆø´ùMè‘°vkÚ${€m°…ª1>m~z$l‡­à¸·6Éÿ^`‡&qZèEcÉ@›"½ô?€(ÿ@Ku,ùåh�%‰@'0űä@”„YŽ%É0ѱäª@¯Í—#I¼4ÍoA™ßÒRK~ Êü––ñX’ôu-µ±ä· LÂ,·‚‘ÿ^`r[ÁÄÅ~’$lÓR;ûmH’0ÓC±D`/Pª™ã“ç·!IÂ,Å’ÿ}ÀäÅ6çgß2Ük6E»ðLÞaüB–¨¥zéÅB–¨e|éÅ"o¥–ñù$ú‡�%a7l-·DÉP×’ºôBb—ÍA“„)î²ù#h’0Ó]6D ˜â.›?‚& ³ÜeCþ÷_Ý]6 aþ±–ê.›?†0ÿXËx— èöh©í²ùc“P‡­K¿?÷Z¹?À EoOqOM£èÚ5<ÿ^ú_Õ¬bp'À¿‹VñÒêÂÙV;h'Ç?шV‰6(•èV_¢%ºu,Æó&`†*ý(3Ba•Ö̤ö˜5/N’ßAÎ|iÕ šVܹôäÌw´L—GÉ}/ƒxÄ`Ý·ê¦ò5|Fÿ}¯­iµ}£‰¾Ñ„_i ÿ®™þîõðGw~üHA]«\Ó~ˆ—Wý6Ÿ /:Ö’á™ÃK†3\°‹yÓq‡ó¯Ì?=ï<}vþìréÉÊÓO¼ÒÂÓãçž-åŽùÿÍ•†g†§¼…ÅÆÌÝGÆðÔlÙòÿá‰cçÏæNžÍÎä†ýÚkxÁ( W…в¢LDš‰È忪d…Oò5J¤}Uz8¬ß ’åÓÌë³+ºc?[ñ‹Ú‰=oë%ÛÓͼåÑóFì‚nýµ»·o�ß©¥>¦ ‚Ø#%Dù¨ýuøw›×µÔf&Ï…nù^wöÃúuEs¼ä7òVin5‡¶³ aÆþr³õ7þ¿»ªtX½Ð½»Ó“ïæ¼H–Á½Õj¨vf§‘ÕSöò5»\ò*ÝXMãQr4Öj}]É­÷KnÁ¢ýe±_Q\¯‘’Ä)ë‹U¯Çë÷Š¦áš¡îóv®Lû�� £`•ô©ê¬à/u Mx ö1iâÜéGî�3ˆG€FÌ2;“LqÔŽO]­Aí5-yÖØ‘ñòÔb:ÿ%c¡Vçÿ5da+ìÖô3†ÜïaÏ«�1T[o¶ÂJ¡š^·<6Š–áÆøÝÜ[,I¤r†Ü·1ˆGQΘ™7õRyaÖtt»à7ÄË®^ µ,¿avm½`8œt7#‡û`÷)Ì-ÏòеÊÑfäa?ìþôs‹Ü¿Á Áܪ{Y:±S[�â‘L–½kÊsŸcºúÐÐxózäæ%{¯Bµ”]c®–Z¢¶|«¶¦·˜¶Z¶†y\ÁªNµl‘¥CŸmg�¸xµZUÎk÷…> �HÈÕ‡ÈO, ôZ¡Î±’nwµù�­y¼ïùx½àØ ºÏíÀð 'àº2¿G<2âÿOh!qº|öÛ û7F÷®�ŠþJ”€`_¥¾î—�oÁ¾%_ ¼àmñ(ËË3bÜnÞ�}'ýZ�ÜßeOÚ4‘Š· Ö~~;ÉIŒj‘zmµj–«ýª 7ûÎ\0ètõE¿€ú½?èéÙú‚éÍÛyW„rô[Ť½ÙFx¶ØðRJIäþƒx½}ÃãJ^Å´áôÚÑüeF=›&�åz6²thþm+ƒâÝà˜ƒãlw¸Ÿ·¼C 5áØB#͘Ò³î¸ò lƒ-6²d?¦å“²SruCwsFÑp¢ñeŸUòÌ9hE +ýÜ+éD¶8{\šôAïEÃà!^¢;‘¢„5Îû m+x>G?]‹ÔIåä´ û­m/ÄN’ŸàØB#+>1“»ÝÀ^Øò]¢:î&„ü‚}HÙëoy¼d˵Þ?š&êf4ŸLîëÄ#¨Ê­²tt¤L„x$SåÊfNcG FÎ+“ÑädЩ£’î L 0Á|ʦ·ñ/,òÑ{øö“tšõ­£bÓDõ6pöŒ’¶œ~ñð#Ø%_ý‘»1 ÛH¿ø“ûYñÈöíývÛ/kA[.Õêæ3ƒ.r' ¼ï6Œ÷!|ö»Ê4¿íqÞ.yî|t߯:×›€ïÁ~/9µm˜�Ä#ÉãXÎ.éu¿ý ¯6èCŽŽŒ„Ø×? ÷Ž,˜ ¶³2ÒË@ä’옖ʹÅXÌšœÂºë{ }ŸŸ–~b-x9ÃqýüIvôÁš)\»­ÏqÃŒ^ÝÕò�¿5~mFCŸ˜º{¤2ú$˜ž\[fRÏèS𡚌n©:0%�­LOFr^žýt¯czÇÃŒ 'éw@?~ŒŸÞP"T¸œ!ŸngAæ¬ÒtkõÓíÄÚtã§vtÕ�ýU�fçAæ¼Z­•üqb ®_S�þp‚ŸÞ(�(Õ]q¾#TVW°CQ‘ü»2•æŸOìºåæÐÐûÈOŒÙ‘“ÀââŽÏöKuiŽ¡Ø »S„7‘™Þ¨uQ]j’&ÿûÄ£, ¢Ì‰€Ðk_VZš¸Çe侎Añááî0íäè\щÕñH¦Ê¾ðÐWåX¦Dp—1dÕ˜´r7š¤Û!w‚ôªÎk]ÕjÆfT8?·Îm=°FlƤ&À®"™m&’šá߀Cþ»�=Úºû.CP÷çT@Ø¢­‹û“”"®A„R·ÌÈÞuIZ�5âþ$%Ík�#al¡5#Ii’ÿv`�¸?Ф)÷ç:TIØ¡­‹û“”B¯C•„�Úº¸?é)”ìÖ¸v<)…^‡* ³¬<É70¹Ês;ÍÜË ¥ÉRÁæd8QŽk5c«$%Ðqˆr\«[%=�Ž£„Œk5c«$%Ðqˆr\«[%5�Ž£€Œk5c«(¨``ª è‘°F`ª¤´9=¶jëS¥§M"°ئ­ L•”6' GÂ�©RÓ&ùß ìÐÖEìP¤ÍmÁL›@Íyм�œiÒÔv¾bÔyмQÔ‹ŠBV�7 �šdï‹O�7 ÈÚšÓB©«“üw¥ŽE¥ ç�ݱBÁÌñÇTy Ê$”Þòò*} Ê$ìÖÖE¥JO¥D ¨k낊$¥Ò· L°d Ròß ¬•J‘J›•Šž�š„,'µša’’è$dIX#ìOz%û�]Úº¸"IIt²$솭 ˆrK”ü÷uM¢„&™ê&dy3]‰Þ„,of-Ñ›�åÍt%z²¼™±DoB–7•¨?ŒŸt§L#·T\ádø6DI˜â0þmˆ’0Óa<è¦8Œ¢|[ËvOþ»€É ã·‘@E‹·ú¼E¦8TºEf:T"íÀ‡J· HÂ,‡J俘ÜPÉoáï—mϤ‹ŽQääx²¼­¥ÚÂ߆,ok·ðD`?0Åþ6dI˜e Oþ{€º–T ߉N{N^†‹â¨’°CKm)éTyGËx)éŠÈ-Õ¥¤;PåMåR÷’;( v‹”š^7 ìw/}˜Ñ–ž»a¹ª ÁZ]2[Öï¢áäwO ÷õ܃44•=Ð�ÂÅÝC¦ÜÓTvB¹3è H„]¢¥æ·6w¯­‰h“¾ñ·:\\61Ä6 §W©éå`qó‹U*禔ѕņÿ0.R× ƒx"uý¢X{ê¥Æ1ÙÁ_4ê@œ�9#I^(hÜiñÐ�[&{‰Àqí°ÛEèÅt._"p\�Cie¹ï`Ï«’9T{GÁãöÂJ¥š^_.x\�ù“´r‡Üw2ˆGQîì«<Î[kfÃÆõÂîU˜O/6®Æ-ýiå¹?Ä Á|ª{Y:¢aã“eÿºÒ¬(t\�¡‹´bCÇ¥¥˜„ŽãTÌY:ôÙ¡ãøœR踗'–mè8Éš:ÑÐqÒ=œìBÇñQ_÷ËG´ØÐq¢õÀ�À ÞÖbCÇIç�X踴jArW‹ —�„ŽSUû)ÇYûUÊ"t\R‚~A踴”ô‚Ðq’o/:.­$hBˆP®gÓ!K‡fã6'Ù0ï^ß%îçí ïÐVÃÇuhëvÒH—˜—× [llÉ~šBø¸}ÀIؓҤGkD0‰Â43ml¦�÷v"­ Ga�J¿Âv&V„ÎÉhX2õ¨DI.Vq^ƒ}-�¾¬‚X»´Õø&oÂ~SIw–~1Šýtöõä+r×dÎJŠ™ÿz}ò?¼û†|eFdÁÍú0ÂX2¬"Ýô¥ç-ǯŠ+ˆÔ@µÝáÎKºe�pö°4é^ !‘·M7X\ËÍ¥9S.¤~®v¯òúA>üÜEm5ÂØEM°aà¯$ÃÏ k«ÑÚ†µ5¡V$êúÅ~àMØ7“¯ÈÝAàÛ°…¦$ëò x¶Ð°º¦TïŒ=Aoæ oo�9VÔVõÚš0WIe s?Y­››3æuêÌqfM+²…° v›Ò¬AïR(kº€5‚A&™5íÀ>Ø}ÒY3â�ëýz¿X´—ýn¡U¨¥¯ÒÇµÂÆâiÉ^. EGìΞMÜÉ?T7ü݈à“èc·�¡ÜrïFm¨|èfâwx¶PGŠ¿• ÝLŒOÂ>)Ê|Ý/÷™C¥I× ä®8 [~¬Ë¿Ašüß¾ [¾MW‡��¼©nEÛj¶¨w/ ‰�´ÉTŠš:ñXlħ x¶ÐbŸ ™ó/ÁrK»¶&ðhj�CòØ[¬Á­•-uwÆxóƒ™õ æ'ë5Á9J¾üè€$ ·ÁÞ&�áˆÙ úÔ«@„;›ˆV°¶Ð°³¦×‡Ì‹&E3šG'÷u âTéY:û�2â‘L•[3¾+\jªÌ×è©zó†§/›Ô£ÍçÍü€ž7ƒÃÜ4)/æis1ï±qN™ór²Ó//š/æ.ÌÑÉé)tÃu„jŠ…¶1 yÚÔYcqãQT‹¼(BYt£ª.“hô õʈRƒrõ ýëZ­a'M¡æì…êP™ÏÌ\9( …bt�òKó= …MáAØB[ý¢¹ä#GÄ“v©d*„,+fï¥B§ƒÖ‰¢øM¤¦à&Ý^2�%Ë\Œ Õ YñR?º„5ÂM R¿Ʀ4ÍûmÙôý[l|÷ U›7–LݵòþWƒé—÷¢è‡„Ì•ö’/pÖ-çæuÃO~Ϧp‹Ž�3óå`çUrM'Ø*Gì©%&›Ú<îÁå&dB=H’Óçåš^…Ö,�µðÿ—ß¹TÙ.wkÌÆdbqIºm»)$gJ2ð•C§þü^Ñ¢œ�ŠVoüoqrfƒ Á’ðÄq¦‹œÇŠ Á;ïDÔ&�`?P8Ú`Þiû(C\€öàì QÚë~ù4ð!ì‡É� ÉÝ0ðØïÈ�ѹëòÿ.ð=ØïIóhñ —E­Õ¿áÞN^ý(>„-Z¥;¦¸(5ægǃvÃä.HDìMàiØBÍAj­Ð Ýìƒ-4#Só—;€g`ŸI¾‘»h ö,lùf­k@_ž·üfÙ�·ËEš1ÕÝr¡`å,�}HDípöŒ4Åê÷”ìÒà¢áþ¸Þt¬ç~Aà ŠPÐÍMÀØ=ò}›™¨•ÕÓ0ˆ jø=ƒ%“í$˜~gm¶h¹óBuªS®oó‚º" ÞÇ[W±{ÀG°¥WW€¶éëÀÛ°…w̯ûåKÀ÷a¿Ÿ|]ñ& ácØ�å›\î²Fþ?~ûCiÛ¦MZ†v¹O˜Ãü’³ÓµJÍÞ%k®ä�̾Þü¬5hä—Œ’?¾é�+B±s÷ø"áQØ)lˆÅöÁ–ß4ЊàËFñ©7ïØå¹yn£~àEØ…ó­_vfbP 7µF(w²M‹Í§˜s Ìp‹=¬*™O›õþ€–3%†l€Ý ¼9Ú%»Ãwš!<û|:�ÒÎQ¹í½D¹(µÀYó—£­Ï#°G’¯eÈ]Túlù©¥>ZJ÷?÷Ù¯kœðî%×ô¢£˜vAÎ òuby˜ƒ�SÖbl=~9¬…«e„m°Û”åÝö@ÐÓ§˜Ó•ë¼ccq­�©õ.Èÿ^`‡¶.¤ƒèjmÏrí³²GkÅ.ë%Óï¯û£ól:'ÏcH#Â^ؽÊD´ÓZX0ó)?Œ”ÎÛÝ ZýÀhôv.ùŠ€Üž‡-T)Kªˆü�/À«�„Zsæd¡ÂÖü¨~7˜Œ6ŠÅ•}Ö*…ãå½2†vƒ=‡œiuœÁ­Ò9SÜÞo 'O¹›ybu8 {2�f¾~T(äàqhŸð2ìËJZwúÅ“À›°SجOî�oÃ–ßØ'²'œÜÞ…}W¹T¥(ˆÚÇÀ%ØKéèUf�‚è>ÎÁžS&Ú‡ÀeØËéˆöðìg´Däøösi烙É`Wl0/I‡ñ‹+Ñöý°UÈÙ%ϰJ®¾X4ræ|xÿ/ýaùðXÌ/%»²IaÖÈ=õ?⮎ˆb7ðªV‰ÛœVÇøT˜ÍªëïZÓ1.óOy�b° ¶ÐÐ{Ã~Ç%= œ„�Ro¸eT6Б>dl}ŒS(x„Q¢:Æä®ø6l'^hJÂ1=Ç2—Lf“3oQ'V·€9ØbÓ\ì§=µ.¾¨t:¸ë#f'�ä­P}t. ÕÕGýúT°+H—¢áúƲ­»ž¹èR§§dæL×5Rë ƒÌ4}Z©Å,Ng½Hq–Áä)v¬ ìÎ][¹£ÀÓ°SÚcÓ<*“ž·Á>¤¤¦¦_Ü<ûLò55¹k2¶¤r ~*—ôòbPØ×-Rpqbwø>l¡Í5Æ‹TÑ ‘6Ùží�ý¦D£Æ’VêÁ&ãYÓÿËä?,s.,Eª/žô‡&>K?�MÇñíy¿µs¹²C#ß|™BåÉl>v]ÿ�ÜéÎ�e‡™’Ä÷Mz”às¶M;£iãPÎ$ÑôQG@Š0:.²OˆàF5Þ6»4d>³øë:¢uÈØiÔu[GAZ€rpX«ìiUPËÑ/öj•e‡À¾Žôåk9r·x¶Ø–Š5É'01@ F�W`_Q.ÖfZípFFòfÁt„û8[xÊ“ó* �xÀ[€õmà;°…6^×üåÀyØóéˆv hÁ¶¤E˽ÿ‡ÜÌ Iƒ~]o–ܲc†‡x<¶6ŠËÆŠ‹“?Ÿ™C=Aœ›€]°…Ö[jþr=ðlá)ê—ï]ƒTÕ�-Þ…ư™»ƒAtÎ'`O¤_9\GŠD(\9p7ò—ám\Ö³\�û:3jä'�Ê5òÍ/K'v�# PÄ#Qٲߺmô>l¯¸c,˜î¢‘3ûz§¦ïSøðÞÝÿĤË}à šýýAƒ1VöìEÇ*y}Ÿêý®½A§HÝÉ﻽…÷!|ö»Ê4¿íqÞ.yî|´Mh�ëMÀ÷`¿—œÚ6L‚G â‘äq,g—ô‹ƒúêi8äèÈHˆ}ýzïÈ‚¹`;+#½ü«&‘d„Ç`Ë ùnÂw„jê®CùÙw?•fè‚ë>?-ýÄZðr†ãú%"4ø“ìmÐ#d®Ù�¤zÜqÃŒ^{Î$ä|}üÖøÌ¸>1u÷6h d5s”Â`"m5§ $êm"lƒ-4ÞY;+ѦHÑŒ¾„M°›2(wá;B5e£em�\$�î� a ìÄ®[.Î+Sà'vdîK«¹ÎúÙ~©ÖrJ [HÂNØ�é´–SH B¹e9I“ÿý âQ–QæÄôÃèµ§•–&îî)¹¯cP¼—L="K‡îJh`�dªì cqUΘés3Ýʹ#:/ÁȪÒÊÝp …\`¿‡ZØR<É&Q’/œ¦X綸_«DMzà!²�° ¶üFRþ[uÈ7°v�°4êb¤±EèxÍ;Pa l¡–ˆOï@„˜&”ÍþK™‰@+pì=ÉKóÈ‘P]w’_šä¿È\­XšM2Ó“ïB•„°…¦öùú.TIØ [¨$«P"°˜Ä.ü…¾ UfYy’ÿn`r•çvšÀ(–J“¥‚ÍÉð=ˆò=”¡&Ñ2Ä'Ð÷ Ê÷4Ɇ²}%ä=ˆ³SSÛ©ˆ(3™&Ê\R ï¡€¼qv…¨X õb¡®A�„»a µ³|Ú|=¶j•ÐKék“ì¶Ájgù´ùz$Txý·6Éÿ^`‡&sýÃFÚÜL± ÔœïC‘ï#gš4µ�¯u¾E¾QÔ‹ŠBV�ïCïk’½/>u¾E¾¯­‰F‘º:É'PªáxQç3œ¾f—¹ïz U>ÖRí|>†*kw>#kSì|>†* ³ì|’ÿn`r�Ïæ@¡¢×_}Y~­4‰j…O¢@–@õšŠ™Z‰~i~­ìÕ ŸD?€,?ÐÖéH]¢@š„:l= ‰¾e¸×€w’éCÈòÃt%ú!dùaÖý²ü0]‰~Y~˜±D?„,?LT¢þ~Ò�2�üÝRq…“ሒ0Å!üˆ’0Ó!<è¦8„Q>Ѳ“ÿ.`rCøm$ЇFÑâ­>?‚" S&}Ef:L"íÀ‡IA‘„Y“È'0¹a’ßÂß/ÛžI›¶£ÈÉÑ€, -ÕÞ€, -ãžì¦ØÂ�%a–-<ùïêZR-|$:íÑeNгP%aŠ#ùY¨rVËx$?‹"2«¥:’Ÿ…*g5•#yîí#³( v+)(Ü4rH�Õìí9îbYïO|7Kä™(sŠ ´Ø–_fAé%lÑRÛ²@îê�™nY ­À·,˜�alÝAü·_Ñ- ¨’0Ŷ¦UfÚÖÐOí¦ØÖ JÂ,g�é—º�=ZR³ÆÛDÃ~ÍA‘„)'ç HÂL‡“D ˜âprŠ$Ìr8Iþ;�É 'wÈÅô˜‡.çµT7ªÎC—„RUe5Jº€R3R|�‡. {`‹Õ\ì§ÜÝdr¯3ˆGÑÛÓU“bcÕð<ƒ—¶4•tî°Â’UA<‚e´ºl¶¬ßïÎÉ�®si®xnõåY¢(¼1ž7ÕMsg¹ïb�¢ êŒÊqò|ŠÌ!<¨I„oçΨ§ÈBu§¹3ŠÜf�X¬ûVÝT¾†Ïè¿"^[Ó*úF}£ ¿‚!n3ýÝëá�îüøí†ÿg6ñòªßÆ^t¬%¿ù^2œáBxaþpþãá•ù§ç�§ÏΟ].=Yyú‰WZxzüܳ¥Ü1ÿ¿¹ÒðÌð”·°x˜¹ûÈžš-[þ?‘NñÙ9*×e؃ïöÀVÓe _lž„}2ù"Dî¢eÜS°OeÐe ÿ§�g`g°>Ȭ*+ìAh³�§M“7Ä£H<ÛçM7çX‹1AmPIc~áD£oToö“O¢TÇ \W¬NK Œ\‡ö­f9ÎÙcé0rµŸ´ b'TaF]yæs…4®¬ #N¼­íG+ "Çì×®À¾¢¼_ "ˆíàÕ�5‚È%Ù5�"Gœ›´ÕÍð°ô è×ê�§´uAä’êtA*„5‚È Š_:ˆÑ9œÐÖ‘K«jèFŠD(\5ÔôºQ¹xë‘õ,—侎Añ¶UІŽˆPnY¸éeéÄ®ÐÂ%ê«‚ÈI.eeD®ïCX#ˆœ¤æ7 ‹Ó‹¬%|ö{É©mÃ$xÄ I‰‘cn°¨D.µäcÎA)¬» "wôk5�o RfƒÈ…Ó�!ßéñ[ã×fô7$CÈSÂaØÃÒ¬wWï(HÏ£`C wg Á>øŽP�ÄjëÂØ-*ˆÉÆj{dÞ�&–D¬¶7µ°!"ìÔÖÅjK²Qz‰AX#âUj’&ÿû¬ŠÕ&�Äj;€×ŽNöeÔ%÷u ŠwFw‡i'G‡¢50ˆG2UÆjBV I+7ÁXmÔ~5k\�¡p6`�Ûz`�+0’n3­u­»{D§â¹oG!ÿÝÀmÝÝ=gdÔ]|v * lÑÖ]|–”"ŽA„5.>Íþ�ˆD Zl­qñYRÒ<¦UF ÞñK“ü·kÜ[¤HšRŸ‡* ;´uŸ%¥ÐãP%a�‹ÏÒS(جqñYR =UfYy’ÿn`r•§L¬¶å ­æEïI ôDyB«yÑ{z=�rB«yùWR=QžÐjÞÚ“š@O €œÐj^«¥H ‚±ÚNB�„5bµ%¥Í“Ð#¡ÔM²Ú$Ñ�6m]¬¶¤´yz$Tw΀_›ä/°C[«M‘6…cµ�‚"Oi5o�LJ�ÌŠŸÜáYuž‚už‚"Oi’gÐ%ÕIþ;�R Gr±ÚNC•§µT;Ÿ§¡ÊÓZÆ�ÏÓÈÂ;ŸÌâx¦�Oòß L®ó¹kݵcœ4Ï@™g4%^^¥g Ì3H™zM´ç#©Ò3ÈB][*")•ž�2 £YÛ¨”ü÷Â>¨\¥ráÚÎB–„�Úº`.IIô,dIX#˜Kz%û�]Úº`.IIô,dIØ [Aå–(ùïêšD M,\Û9ˆ’0ÅQƒý,½neˆ ÐþhÁ¶”‰ö]à ì•tD;|û¹´hù'SÉÿ§ÀÏÀþŒ4�¿°¨3@-¡uŠC¡ðlÑ*]kÅEi{pZWl1ž…-´¤Í_’GWy °îöÃîWR�è;€ÑWÂë/_�ÈÝnàyØç¥Ü5 /Ï[¹yÝ�·ËE_À¦î– +gù‚æ-cDmøöCù>x¹T4]W_±Ëú²Qòhg²‘ËÑ_Q÷6ÜíäÒñXC_4æ(ü©Á½oƒ�㥮>â7­D;˜8"vÔ©öüøsŸeÑÕ¯æ˜e×äîwç#Úšës$ùŸ�‰:º: !9 8ä¿ÂEÑÈÂtýADÑrç…ê@6ès»Ÿâ:°q5noHÄîÁ~”NØ0Z¡-@ú:ð6lás%ë~ùð}Øï'_’»sÀǰËw%¸Ëùÿø!ì¥yl›6ý:¢èÚ¼¥‡ U· ö6©ÒÃ~kï’5W2=ÏìëÍÏZƒF~É(åÌ|o\Ú0¢ÞNàQØB+¤|¢!w @Ɩ̬VÄÞ^6ŠO½yÇ.ÏÍsˈØô/¾(œoge§LÈývåÎj±ùszç (—�9Ï-™O›õ®É[ Þ`°vC£[ñMýDí0ð8l•kû/ÝŠîè'ºíÀ^ؽJš$úÅ]À°O$_»�»FàIØòËb}Ôô?7<ê5®nç�*Û=8IË[ĉå)àû°…ÚíÚÁŠN¦ šÍ@fŸ€¢¼Ûˆyúsöx�÷M@uû‰ø{ä/°C[×$éú—¹KaýÛ§ß V%i+ý€>k•¢aOe(䆧W8k€ÁA؃ʫhѹrbu x¶Ð9þÚYp®œ˜Ž¯À¾¢¤b¦_<|¶Êuƒ˜Š™Ü oÁ–?Û/2WN nïÁ¾—DoB|®œ¨=.Ã^N¯7!:WNt?ÎÞW&Úw€Ï`«\<Ø@´÷�+°W2hŠÈÿsà§°?•æq>˜L²Üh*‰n(®DÛõÂf!g—<Ã*¹úbÑÈ™óႼôÃòàyØò3¥[Ýrnž–Ç9Ù0K¹•‡Ô�>ßt9ŽNÌ jDcƒx”I{ÉtfcÜn3“ú˜ìÒV·FïÒ/÷«™u‡Ž dÈ>`�¬“Ì�=À.Ø]Òrx@Ï›‹þè0ØQ J6m'™¥;-g�ÜSÿ#îêˆ(v¯Â¾š^Ïx8ÌæÕõŒw­é—ùg)†lƒ-4jÚø!D–»cAÜN/þœNÇ¢iT"ü-ñ�v[0¶‚žÅ0ŠáØW’ïY�»vàl¡½0kÒx0\¯ ¶TšAYw=§œóÊŽî’2™É ÞROT¯K°KÒ”+‡A›ê)ÃglƒzŠ»n:–™uØzzuÓq¸$ÌxÖô8ƒÉÍšn=ËL´ûa÷§Sm;ÈLTÛµÕpáíšàñš¿¼ ÈÌœ&] ‘»Fà›°….‰X“¼'¨š3½p³kÉó‡ì(Ø@¶ ÅkFΤy·c®c.øCªˆè� w t",%ª›¿¼–H=7;<þœ#qm}Ñv]k¶h&Yû3gL‚Y“Mšè¬ ûé.ƒ¶o¯îoæNlæ{+Œ$­¾p—¹g.ê9£D{ph±?@^ðSÏZ¤”¶D6c³!g™UbI¶×(!­.NžÊ©„ø—mÇ3óÁ~–’é¿­c9_ ‹ŽßÖÚe7(‹Ü#ú3 Ox ö5é9hÖ0-KÖ­¹Ð@…^Ž?ÅÙØ”Ì~î´ºläÁŒ»çL®;ð²‡Ø7bÙ< ;¥½�;F¥‚ÏãvàaØB· ×üå]@ÆNºs@®�çaËÏÚí£‚í™Å¢¾ˆ z�EÃõü4*;AÇ¥9ô’Iûw g…;¹FÖ*Si%ø/ãöƒÉµ°;ò³×Цá„;;¸X"wx¶ðe\| lóèêÄÛ�‡`RÒ¾Ò/îž�}&ùª‘Ü5Ï–¿™ðPÐÅ÷S¹¤—«Æ|Ø®Ä]ĉá9àû°Å¶)±Ÿž_dQƒk”üa í¬èþൄú½ö%¼ô£�˜„LË,Iÿ¤ßÆÐ]%ÝtߦKMì\®ìÐBj¾L¡cƒä_tlªZEZ¢Q�%TwÇþÉàŠ9Ûïß,:tt Ì,y\)Â}°÷ ÜpŠÑ. ™Ï,þºŽh�ŽÀ:ƒÁ_×miÊ}ÀaØB­iÍ_î^€-¶ãåk9r·x¶Ø¦ê5É'°Î| %‰ð ì+ÊÅÚLëÎÈHÞ,˜Ž�bç`Ï¥£ØÆ�xÀ[€õmà;°…nž¬ùË7€ó°…wñ‰v hÁ¶¤EË}€ÜÌ ÙÁ“_×›%—f…ƒ³nÛ ã^¢ðŠ �k‰.‡E"@fÛ�¢ kxl–Ê AxÚ¾ûáï OÚ¹FîëÄ£( (x.æ^¡.¼ôX¶ 0†—ŽP8äh\E D(ž]eÔ4aXE*K ~UÂJ‹¦Î€m°ÛD(ÔêeSŒht0ˆ'팻ŽÌŠ0#�Ãõ¸R×Ç<�¢Bû²Ë²*Î'N³1C7ÒÑÈ‚ZiÞ7™û‰µ‰«¸çÓŠ«—ef'¨}×�'a �xøû?»Â‹—Å'(ˆs° ¶Ð¾š¿\<ûTò½ � ¡º#ø»¢[»0pæîb�3À ØéWo!E"®¸›ùhÁuRÖ³\�û:3jæo""L¨™Ÿ^4sVÁÊ«™òÒé˜MP¾™o•M1¢ÑÁ`FÍü-dV„Éø6\ßVJã*Ýp׬Wnµ Î[Ì• Ç(yØó@÷½ÐÖ)›÷=î€;!Óõ•häÙo‰!º«…�a#ìÆä®»x}B&¥d–^B|cM.˜“¦(�Ñv·|´×jÍÎ7îVޏ7oÂ:²¸æŽû²ô?µs`�ƒ#ŸÔ"ËÆ+»‡ä&<û¸4í~JO„€Š.É ®{§BT.¹aÝlæ¹éÞEÂhú _šîÞÙ²Ç.½T¨r²›#Bæ¶qEEZhQéöÂîM¾D“»mõâºMÅÕº‡Q¢=geMiªe»l-à.¸Dñð-ØBáåšµiè%ÂŒZ׸žQJãÌ´µ` ‡N꬯ÆÖ¬xô¢Yš£pŒÜ•Ãð%<[h]xí^aÅ[‡A“Ñö½¬‚r“„rWx±ŸªªÙÞ#ÂW¤f#*=Àk6r×L±f£�S¼’"Ї´Õàbjj¶Í"•ì»Ð ¡º]?ܵÛ{pazsoÃÛ#YÏr @îëÌhà}¤@„rs-/K'¶.¡ËðÄ£¨z»mô>œÙ¿C—Â/9³¯wjúþ-Ë3{üÆÐ2=¿ �êTö÷íâXÙ³«äõ}ªÔÍg�MÝÉï»}€÷ùů1DEšßö8o—º{b�ëM@¦è%¥¶ “àƒx$yËÙ%ýâ ¾z+&rtd$ľþ½wdÁôëî•‘Þ~nÚ"É�Á>–Aò=�ïÕÔ]‡ò³ï8~*ÍÐà>?-ýÄZðr†ãú%"4ø“ì#Ð#<[hÓáªÃŽfôê}s!ß0æ“þ†>1u÷6H d´¦„ð‡3ÈèYøŽPMFï®:b"’¯9°!DK(Û;ö»õÇÜ ÏÄ:î€~ü?½<(Êu�U'œ 6¦Ò„kõîÄÚ„ã§VB¹Cªmlæ”&yœ‡ïՔǖµK¾" d� a ìÄ®[..Ŧ–ŸØÇ ó±4±š[ù?Û/Õ£kÁ��°;ÓéŠ=EbÊíü•“4ùßÏ eIeNL'Ÿ^»¨´4q�}È}ƒâC0’è%Y: Z¸¾!ÉTÙw×›7½r¡©>g–LÇʹ#:/Á²ª$­Ü OéT¨2÷œ¾4I[ W|l�l%3µºf�Ûzà~Ø*¯¾Š™³‘ „ÑF¡�3koþâž3%ÿÝÀØ=ÂÒ¨‹‘Æ¡ A¡ÂØB-Ÿ"¡Bì1TÐu©ãnNZ�{`ïI^š‹�#al¡­’Ò$ÿíÀ½°Å'Ìã¤Ù$³ÿí¨’°vGò ýª$ì„-Ô ’U(ØLâÞÀ…~UfYy’ÿn`r•çv‰KäˆÒAj-C|u Jå¢^´\È ÔA q ÎNMm§"F Déh«�…Ê…¤@âìÒo@ØP õbW‹¹Ð#ánØBí,Ÿ6]è‘°¶üœ‰€6‰À`l¡v–O›.ôH¨0Ö·6Éÿ^`‡&k N›Û‚à}5§EzÈ™&Mmç+F�éAõ¢¢�U§yxšdï‹O�éA›„U!§Nòß ”j8^ÔùôÕ9e/_³Ë%ÞÎgª,k©v>ËPeY˸óYFÖ¦Øù,C•„Yv>É70¹Îç®H¡îX¡`æøï[‚2—4G„^^¥KPæR¦^íùHªt ÙC¨ÃÖ“Wé”Ixö� TJþ{�a‹_F§Òæ@¥ÓžáA�99.C–„�°Õ­)ÄJt²$Ü[~=A@¢D`?° ¶Ê"#ÑeÈ’°¶‚"Ê-QòßÔ5‰ú¢Qü¤;eyº¹”“á3ˆ’0ÅQü3ˆ’0ÓQ<è¦8ŠQ>Ӳœÿ.`r£øm$ЇFÑâmáW HÂGJ+P$a¦#%"ÐLq¤´Ef9R"ÿ�ÀäFJ~ ¿l{&m tŒ"'Çç�ås-Õþ9dù\˸…'û�)¶ðÏ!KÂ,[xòßÔµ¤Zø&HtÚ£‹ð8)~ U¦8˜ÿªüTËx0ÿ)ŠÈ§ZªƒùO¡ÊO5•ƒyî$Ÿ¢€DØ­¤ pÓø R B5Û{ôª�,A˜E‰Ý,Ÿ3B¶.\šãv³´®å+´¥åsZX�?¦M¢Lù 5¹«€-4öç+KŸC^öÂîÍ ¶'ÿ�‡`‹m`W¿¥åû Â-µ--ßfº¥…´SÜÒò}�#alcni’ÿvà+º¥åû¡JÂ;"ßUfÚ!û€)vD¾ª$ÌrU�üw{´·´;D".¢ü¼–êdØç!ÊÏkO†}%äóZª“aŸ‡(?¯e;öy�ÏkIN†íbzm¾Iâ¥i~Êü‚–ê²× Ì/h/{� ®¥¶ìõ(“0Ëe/òß LnÙKxÊö H§lŠ$ÌtÊ–´Sœ²ý(’PÝ”-÷0ŸÜw2ˆ'm)¡ÒÙ† ¾"CE‰Ù†¿ f„:lýMþ ]Â-µÑ$¹«f:š$­ÀG“?f9š$ÿíÀWt4ùCP%aУɂ* 3M�}ÀG“?Uf9š$ÿÝÀ-©Ñ¤àþó† SÜþÃÐ#a¦ûωÀ`›–Úþó† ³ÜNþ÷;´¤öŸËÌt|¢ü¢–êLÇ!Ê/jÏt�N`Š3_„( ³œé ÿ]ÀWx¦ãKPæ—´Tg:¾e~IËx¦ƒôu-µ™Ž/A™„YÎt�ÿ^`r3 ÁßàÞ(N~?I¶ÁVÙÊÅÈóG IÂvØ Z9~y�½@©fŽOž?IvÂVÐç–'ùß”ê€o(Ï«òièºüQ-Õ«/~ºüQMòê Y��. TKǧÑ…. {`‹�Nä4JþuàØbUùFmdîÞã$øcÐ$a;l¡ÊŒOŸ?Mî…-%œ€>‰@°¶Êí£1úü1h’PÝ…Süú$ÿû�]šÄîÑ õ¹“ѧH%úãæ�ƒa“¦vª%F¤?aþ8§^8q$EJº�=šÄ\ ŸHÂ$ÔaëÒïϽ˜@î0ˆGÑÛÓµÔ¦QtížðÒ¨fƒ;þ^X´*ˆG°�VΖõ×�qòûûZx1á>Øêú8[}y–ræ¢ãyPÝxž;ƒÈ}ƒxeP{ÌöZN’?�œ!Ôaë©äÒO gÕ�g¹s‰Ü÷2ˆGU.Å,Kr’üIäÌO¦žK?‰œùÉlsé'‘3 çRÍoÕMåkøŒþû)¼¶¦ Ôóô�&úF~¥%ü»fú»×ÃÝù=ð#u­rMû!^^õÛ,/þÿ©ûצ8²5M\B ! àB7� tGB’@‰nH€”’’L¥G„¸ˆð…{ Ø»vu÷9§/U»«ºº»jWWwWuŸ>ccÇŽ�õ雟2SŸç”Õ‡úØ{üu¾Ö³nïºUÌuÝ1ÆÖõÊX¾TÈ{,÷ylsuíNemãέ¯Ö§Íµ/ŽU\»z{c=;îþ³b�-�-8Åò„¾4ÿQ[ÈTM÷?œ¿s+{íV.3;æV_cEÝÛzôðh�UâÑN<ü]-'\Ž{)�No“ÓÈyí),—eNËlj•ÒÆ¦[Ò&&µ\I³JŽfäL‡>XÕN¹7?žùræU˜ø¸Fž�Ô1B��ìïý¿íßÑ•z»4{å¶ÿá�ßoãÎؼ£dÎXn/ÌÛ\dÐAbæ%Ìôÿ÷úíw~Ù&æà…^Ï/νÏ:�*½uê?Ժݙ{N×÷C×òùÐvãc±Ué;Êm³[nófÁØå+×j$¤+â „õ‘«\ÇÎk¯ †n¾ìs¥l•ÎHð.õÔLK[ؖ⢠œ Ç`�)óN>r?Î! Òû÷ßÍ,< a¶—ùãBÂNØ�2Ì Í,½64Û‹¼ 9ƒ=©|!÷Ç9Äó Ȫ©�Á–J P¯–õ‚©‡£½™±�…ÛŸTÆ�ûâ‰(cúçlÍY5míÉ£—‹Z)óÙÈ:n×WÏy7r=äºÙCxöù³Ê1�BXânÚb`_H>«ÈýEñHfUÓÏ¥Ó0ØtY ÅdéáËòP.3Ÿù<¢�ŽŽŠ_bÐŒ¬ÂÚ¶m¥­²\ª¶¾&— ?ȶô“–ËA?“kˆGR.Téxõ4‡xäÕz_ù~O0‚ÔZ!Â�ëš>5�Rë6J½ÓVPó™Öª;Ô÷®PÎWJEM‚g;ð"lù `ÇF·;<ïñ” u8{*²rvØ º/^çö^ïð>¼û¾riŸ !ÿ€a?Tæ±ß5FEurÈÏ]Cn‰Œ@'OÜñ˜Q‘ u x ö©ÄtrˆÃÓ°OG ™Ìéö³óÜŠ™Óæf®Ñ«] )DmxöíD3hxö� 2ùŸÞ…}W½ {×5 R9ìç°‡ñd©ýDç0ù‚|˜C¥‚Ü` m:F±AýäEì>eYw£È}?‡x’¦„®”ïãîÖ›Ûëöû‰QŸ¨Ø»Eº/·�îcÒ++^ü̦¦‹†³ZÊÙ2D/À–TŠÉ¸™…¾£gËõ!•ôCî‡8ÄÑÛ·.×r¨ÁH„^»CY»JIÐá¨6>Û¯Jçr#@<Š©rw‰¢?˜âÔÃvËÌ×UÃ/EÞÍ E¥ƒñ‘] ß�~YIx¶z»-œŽ�p`4êb»³P§MšáOdmzΰ³³ÜàZ÷#H¨ *•hô�íóªê C”š8T+¦MÊQ7 ÐâpÛë’ú:±%ê6ýjqnhX<âÖ…„ï¿=L2˜êv×[)wÁn²”*õn($@5µTTéЊÙVñ(¦JýVJ? °³ž‹Ë†-o•á„.ͯQ•:Â�;-6li¾rW­ÁªRnÓrØÒ|e· sr;5"èˆ�ÃÉ?p€íXË*Qñ6˜:|¬[™2ä´¶73.]p§‡íÍ”Í ñÕÆÜ~̰½™q ”«'ÂÖr&&ÐS( §X‘¼Fm¡›ÿdÔÉ­;ß'.ur5UØù>É©“tCNƈK�œ"ÕfÕIþƒ–C©pþÔžÌ'î ni³lòëcµmÂa{2ã’'·=#lOfròìƒ,ûXèžÌ¸äɵèa{2“gPqö±Ð=™Éó +O™©ª~’ð8l©Å9bâìgµ=ì^•ÝÌdã(Š“t»aK•1qöC�ý({˜d•­(NòßÃêÝÏéBò-»Üµ”PäK´e€"XÊ-ûT9ÀmÙ È–nË>ÀꃢøZvés%5V;ä>IujP¤–¶:5(RKV�©¥¬N ŠÔbUçÑ\æ…i;õ¥¢1�3P&!×�[¥gXí*†°k’S)`õ³Ø–ícq©”Û/¶w,©0-¹äOÒ4‘F´¨…gëÅC!D{ÄβÐ2" ÑÛBW*L{ŽùÅøÛÒEŠ»H“»f Æj�PÜ%é²â\¤%I¼¾?ýžc¡g?ETß·å2Óå²aå–ôLA4Ôpb ìa; �Kç!Â�H“«ë‰À) ÒX[L¡ç¡JÂ4'È?p€Å5‘йE¡2‡—\€4/°-ˆ¸ezÒ¼À¶ ñ’—)ЀA·DªF“éH“�k�—)ù? *ÓsqT¤�+†î2éE¨’0ÁŠô"TI˜jEJN¬H¹uz©V¤ä¿kEÊ)T¦"‚4‡X¢é¤9ÄR®H‰€L°"‚4 Ó¬HÉÿY`|©üÌ×0$I˜àÌ×0$I˜êÌ8 ìa‰Í| C’„iÎ|‘ÿSÀøf¾»ò4í¬ÔÊ�Kå%–躖Kå%–òº–KPÈ%–躖Kå%–îºòßìg1®k™Ù0²UG´ú¼ E&8¿pŠ$Lu~�tœ_¸ EöÀŽ t «“ü÷ã›_h#uš¶cË “F Ê–è0iªa)“F�5„ “¸s¸R&‘ÿ~à‹k˜Ôî­˜Ù CúÄ·ú^�,¯°-Ë›ã–èÈò Û²Œ5y‰^�4¯°ÐãŒã’èÈò Û²Ø%q‰^�4 5¦0ûÏ—Q(’0Á&~Š$Lµ‰'ÝÀ›øQ(’0Í&žü÷c]º*y�È$9ÆÀ�A’c,åüd9ÆÀ�A’c,ÝüdIß^ñ:‘qèrœ%ºgiºgŠ{–T5Jú€JƒX1�ŽC—„°åú~j%ÿP)ÏÁ«P$a‚ üU(’0Õžtlà¯B‘„i6ðä¿_Ø_#8k…œèZ¢ ˆr‚%�€('XÊ!Ð äÊ„j‰ t¢$L3Jþû€ñ…@Û|�ú‡î‰*ôTy�%dºU^c)™®A™×X¢A¦kPå5–n�é”I8Àâ 2A¡þ)a¢ ½U^OV¡×¡Êëi+ô:Ty=Y…^‡*¯§¬ÐëPåõXŠFÞ Ó‹ ôDI˜`#¢¼ÁRnäo „Ü`‰6ò7 Ê,ÝFþ È g#4—yS-9Æ\ΰ3o ïE½ eÞd‰îT¹ eÞd)ïT!@�%¶Så&”I˜æúzò?Œo}ý¡\†N’™í¼M†\ —>oA“„!ƒ&§O"ÐTÚ,,¦Ï[Ð$¡ÚÉIjú$ÿ§�J3i?u1hMŸ2áÐÛæmz1h\"½ aÞf¡ƒ&'R"ÐTꌉ‰ô6„I¨ÁÖR)ù?dµ}Ñ�–Œbi]jmý¨’0ÁÑÒ¨’0ÕÑ8Lp´tª$Ls´DþûYýäóxFK ÷OB“„ 6ó“Ð$aªÍ<è&ØÌOB““,ÝfžüŸÆÚÌ+Ýÿ}¼ËmæïB˜wYÊÍ<è&ØÌsÇ-§ÚÌ“ÿ3Àøšù_¤‹ŽîtƸ É{Ð%a‚3ó÷ Ë{,å™ù{($÷X¢3ó÷ Ë{,Ý™ù{(#÷Xœ3óÇr™·Ö¥¸Ó´9Å=Na ÚœbŠÇ)¨êt D¨T™ˆét Ú$äŽÞH\§äÿð<ìó‘ëôp.ómÅ”Û�|¢$L0|¢$ìa)†ï‰@/0Áðý}ˆ’0Íð=ùïÆ¾¯ T¦KúÊ|À ß?€2°”Ã÷D`¨±ÄÂ÷ Lš"÷ƒâIšÆC¤@€Ñ4U¿À_  pÈÔ4HÆ{€OUꀩGÌ/¾�X¢=wr× Lð€GÈÂ4#cä¿8À⊌Èe™–è:ÖÇPa'ìÎøñ* <ûX•;8<;Êu¼ ¤ùr$ì‚Ý•‚4É7PiïOÙS0ôŠÔ]�O J–ش¨’0Õi"p ˜à´Â¨’0ÍÊ“ü÷ã«<é•R¡Z´$öúÍ@”3,ÑQÜ D9ÃRÅÍ „̰DGq3å Kw7ƒ2ÃâÅ5ç2³†“]$7 =ƒ-ÕΊisz$<[êöUm�À.ØRí¬˜6g¡GÂnØltÖ&ù? ìa ûãÙ%ýŠ|ÊÝDõŠ|ÊRÞDõòxÊÝDõŠ|ÊÒÝDEþ{�±„âªs¡ôõq©*<Õõ Tù K´óù Tù K¹óù ²†0ÁÎç7P%aš�Oòߌ¯óy4P¨=�ÏYÇÄÏA™s,Ñí”9ÇRŽÐÎ!{5–X„vÊ$Ls�5ùÆ·ÀÚ?®GvÍÀ3È’0ÁãzžA–„©×CN•V‰IôdIØ;‚"*,Qò?ÔX\Çõ¸ýF·—èŠeñZô9dù‡,Ÿ§-Ñç�åód%ú²|ž²DŸC–Ïc•¨ô�/ HÂÇJ/ HÂTÇJD ˜àXéI˜æX‰ü÷ã+µc«ß Ó1*zA�ãKÈò%K´} Y¾d)W Dà40Á ô%dI˜fJþ€‹«mƒD�Ši­R|U&8œU¾b)ç_¡ˆ¼b‰ç_A•¯X”Ãyá5$¯P@ì�¤ Ó˜G ÍR–þíw¦•* «Y^ƒ×k¦Z§ì¶š¥“g+µ å ó ñ–èEä®8À.Ê+Go�„l-…šžüŸ²¸v)´Ðœ¬Ìéÿ a‚]å�0Õ®2è&ØU^€" Óì*“ÿ^`¬‡¯JÞž²I.²D_]„$Yʇ¯.B–‹,ÑÃW!ÉE–îá«‹�%a|‡¯ñ¢µ¨?§++¢ 넹Ä݇¸aö±÷!�~àKlâ„I¨±¨Zxá.*¹?Ã!žˆÞþà²mzÁ.…x>‰—~Ë¢ì 'À[¿hÕ�Bÿ—ÿVWøÍƂ߹O+pvt=èJÔ¢«xÞLQ¥ï Ì¥UšI'B‡R‚¿E¾öÃŽn|²[}‹|ù–E¹[T8�¾…DÔ¤¥Òhù¤b®Òô™Bx vt‹wË ÷ÈÂèÖ/ g¹ïãO„´mk� ¿È”‰gÐdʇt3è2%@é ýVÓB.ÄgðÏG¼6c­0}£�¾Ñ†_éôÿÖNÛçÿè‘߃ß1¼ÙOç!^Îö·±ÆÊnÝ¢;ÆØº^Ë— 9£b�å>�m®®Ý©¬mܹõÕú´¹öűŠkWoo¬gÇÝV¬±¥±§XžÐ—æ?êc ™ªéþ‡ãwne¯ÝÊåofÇÜ21VÔ­1š ¤3Áæ­Âæh�UbÑN,ü]-\†{)…ú·‰iä¼ö”Š•Ë1§e6µJicÓ-g“Z®¤Y%G3r¦C¬ê w5?žùræU˜ô¸7U ƒ ÙßûÛ¿£›ûviöÊmÿÃ¿ßÆ�ÿ°yG¹œ±Ü²à²ç 1ófúo÷›ÿðnÏÅm"l ^èõüâÜû¬hÒûW§þC­Û�­%�ÏÞ”o-“m§ð1> [E¾£È6»E6oÒÖõ†_‰¸B#]áO ªÿ«\½ê…×C· _ó¹R¶JË”t¯‡mZÚŸ âE¡ „›Â‹‚$iá´kBz(Ÿvr‹ÞÍ,< ¡µ—ùCuÂØ2´Œ–-½6ZÞ‹ŒØ[û¼û¾riŸ¯"ÿ€a?Tæ±ß5FEurÈÏ]¹†+B�øÁD ZÇ€§`ŸJL'‡8< ût:‘Éœ>`?Û±Z1sÚ¶L™HPÞ†};Ñ Þ�}'…‚Lþ'�waßU/È¥Š¦‹jå°ŸÃÆS�¥Ž!:Ç€ÉäÃ*äƒhÓ1Š ê÷ /Bg&Õ«#÷ýâIšF«P¾�»[on¯Ûï$F}¢f` ìé¾ÜvB8M¯¬xQ3wl[ÒŠ†³ZÊÙ2D/À¾¿ŒÛ‘Yè;z¶\RI?ä~ˆC<½}ër-‡ŒDèµ;”µ«”~€jã³Ëªtè;9”Ê7¸� Ò7’l£q<ÇšY=f;²’Ò`�“ó‚bÜÔœ‚LNiéV,Ûí J+fV/h¶ûzE¸£BÄŽ¯ÀŽ.ȽoiáíŒhVu"{¹QuÜYÅe?øQ̪Ӛ™×Üú¾¶,Y:_Û›BÌ+bvxvtC÷]£»fÖ(pöD2™5¼ûšrfÒLÛ) —#"rx¶\!4of§_, $î°Gµ�”XÞàj½{txóæ°V¢nÓWÓ6FE3‡;�+ìÔ8ÙQá´&Èã8Rƒ° ¶|k¶þgrReìN¼�×`K•ª‚©/D>üûm仉üîR{”ˆy pö€ììøå½Àë°¯GÐ<Q][3-Ó1õBaS² "f7€¯a¿VfxE·Ü¶ÊÈ–ŠQô¨izÞqG09ÓÎ"»¬í«é¬Šˆ(„Ü2…V0Žy#—yRãÛ°ÿ¸Ñà4€`ÿ�LÉ8BìyòÔ'�s°ç")'P?ÁþûBîF�?ÂþQ½6nUÈ¿ÌÀÎ(óx:KA>«VÔ²õµë¨*†ŒÑ•Ñ-ï~ÏvK¥–óâèöÖŽ¦èËps›ü™uŠ/óÀ­Öl}Ýíí:%w¬BkŸ4ªO\ž–;†±�RÅÈ �x¼ýˆF{jÃÁ—àŽô¦Nöø˜j'Œ¸ÌŸÁ~!!w�Ïa?O¡�Lj¾„ý2…®W°×…0ú®W{Ðõ’ …§~àeØ—“i\Ž¡Û¥pϱnž‚-ÈßñË{�#°Õמáº\|oFײnç‹**‰¸| [Nâ?µŸ:1µ…û0Äo ø°ÿ ™uø}ÙÛD‰ñGà*ìÕÈ$¶ü ìßÄ_;“»WÀ?„ý‡êµ¢ð��üÿ#à?†ý�•yÜ¢&ÞvôÍ €ëns�Ræ±Jé«­­ºÝw\á~�§³¶�Ü]Qò=~)©]§¾ÇGEò]%Ë�eé Õ˜ŽÔÀ†Ûô¬¶ll×:á8êîÂáZ�ÞÎÁ–ˆÕ GýZAþº â|x ¶t¼bÇ/÷ƒc$赑»nàsVë½)Júh0˜ÐÃ;Â�¸à04ÂeØË)t⸻ž~q�8âÔü¯ÇuÜ"îÄѯíF׉»Àuâ¼c$=9âx¸{!òZ»‹ëÉÕŽø®·‰£ü#Ø” ÞÔ®5&ÖŸ€_`‰Lo€ û�㯹ƒSF û·)ôèÈÿ¿þ ì?Qæqo{�Î/h_¨/O½$ŠßXÕbÆý[)ï÷ït¯.Ü­ã¶ÿò×0ÿ"ºuÜš­_x·ŽÞþ�Ö­#Îg�Ñvëú¸'Án¹éþ‚ºuDç0ºnÝ£9?ͮݖ˜þâÕ3´kÔÞ´ÝVƒÚî\¥T.¹ ¦�«î—Eߣ%‘ðìGÊï1¼ÀºéljåJ)S0Šöˆf:#¯›…jÅÑÜÑëè°ð îð$…=YWVe¥1ºÁê×ðÞ`’At±2BîÆ€a?TÎÄÍ^-U 9Ì(ˆ*‹ÈLçaÏG–Kr ®Ò‚kî“\Õ¡A¤„Ñ­ê87ª-ÑÎN÷t„‚[‘Ñé zÕ)u‡Öµ6…«5b؇=YXvëÜjX Aªœ¦´$”Ü7qˆGR³Té 2�n€xSå…§sãÉÆÖ¾®þÂêzCS$rÛ…µ!o?”Û\Õmë¢ðTéYä-!wd½â x±Ðú’ ·”*~‡ÕÈ ‚s Fȵ5I‹ñ<\M™`»³P§}�ù=‰ñDT…^Îv¶b–ëK´v,©—O4úÆö�Ô†(5q¨V¹tþ\: CZ÷yˆC<5Ð/ͼ6T1¾TÍŠñJ/vYÏCƒ ‹oèÒ†ÁwlŽ;®œÒh¡óð°7¨œv[¯²;Êt†~­�ÕŒ �®È±çò¢ï6Œ÷!|û}d"lYΕ,Çí}màzðìñÕ»&ÁGñ(òè«÷Ž‘•““> ‹Ÿp éCÈÅO«Ëð`4Uí¸Ûi÷®hµóÁw&Ùˆ68Y4Š¥Êæä xòqüx½µ=L²·¶µß_Ïb÷ÄYq‹k[|:RÈTnha¦ž­Ø~žÖ¸©äæãâÌ‹™ÇKÚU‰|;B®‡¤È´½ž�[œ'(~ÓZâÙx¾Œ&;·†ehd;Y­£�n®]‘k)çÚuø0²\ã"KÕN7@æF¤¹¦ZgÞBµ:3¬/Öñ›a¥Þ­9ì…Ý+ÃN¼7Å-Ná§°×3ù?Í!žÈ’ ÈœýtzíÛ‘%áá ¹oâPmø²®Jçów8ˆG1UNÕn'Úv\³øÕD“ȪIeåî6ßÕQ£*µv�Î×hž‚ÝI ¯O wÍÀÓ°£d)·ìY}ûi‚-ûC(ò!K·eUÆ×²æ/4d8 QN³DFÓå4Ky`4�\™VÍ!1�NC”„iŒÈ0¾�ÑÑ\æ…i;õó\DÃ:� ÌG ØÆ$b*}e>Bê4K§Ž¢J‰ÀPƒ­Å¯ÒGP&a°’íŒòû ‡FÉý ‡x’¦ñ)`4që�í÷Çó7SŠGiŸ€Ø¦ºÖë§NÑQ<�É•¹WŒg@´M–¨X‘&wÍ@�ÕVÏÆ]’f�3‘–$ñú~Ňð,l¹™ùÝêû¶\fº\6¬Ü’ž)ˆFf!ÂØQ޶cb ì…Áh[¼®'§€JÃm1…ÎB•„iÎ%�ÿ~à‹k.¡s‹B§+•`²ögó| i>Ç6&Ù7“éSHó)’§Y:yeJ4àØR5š˜L¹ó¨jkcÕûâ2%ÿg�ç`Ÿ‹£"}\1tÇ�©H¿�* ¬H¿�* S­H‰À)`‚é7P%aš)ùïÆZ‘r •©Hç Í9–hE:iα”+R" ¬Hç MÂ4+Rò_E*?ùõ ’$Lpòë$I˜êä8 ìa‰M~=ƒ$ Óœü"ÿ§€ñM~V8Óõ9Dùœ%Á}Q>g)GpŸ³úI FpŸC”ÏYº\òߌ/‚Û’ËÌlÙª#Z}¾€"ƒ“š{E¦:œwJ˜à·5Õ °à¤0Âø&ÀÚH�¦íØ2ä—PåK–è0é%Tù’¥U©3¦²Ì/¾Y–hÏ�Ü5¼ ‹l L32Fþû�,®ÈØ�\æ‘iå¹å ÂNØ�ñ+"ƒ},�Ê�ž€å^�ÒÌAŽ„]°»R�&ùï*mÕùÉS{¤/¼7 J–ش‚U¦:­@NœV0 JÂ4+Oòߌ¯ò¤«TJ…jÑ’Øî—‡(ó,ÑQ\¢Ì³”Gqy”�`|�¦vìö{a:FE/r´ K‹%Z‡Z�¥ÅR®C-hÄb‰Ö¡di±tëPò?ÔX\uh$ºèTLkE�b ª$LpD_‚*K,å} E¤ÄÑ— Ê‹rD/¼Œ¤„`$E˜F)`4«Y´m«Y¼Å^ KZ¾€¡[“.Í�–´ßÊWj]K…ù¹¦m²LÅ 5¹kž�-+Käá ìÁj{òßMrëZl¨€°“%¶®Å† S]×BŽ\×bCŽ„]°#˜Z–&ùïþB×µ8P%a‚ª$Lµ#BNìˆ8P%ašS ä¿8Àb\×â-�Y÷]…(«,ÑpC¢¬²”à U”�*K4ÜP…(«,ÝpC¤ÊbÞ�PèãÕj ‰ŸMsÊ\g‰Î}­C™ë,å¹/"0ÔXbs_ëP&ašs_äëÜ—ÂÄÂWÈ’0Á ØWÈ’0Õ 8 L0(ö²$Œ.(&<Ö'÷â‰èí.Û†¡ìRˆç;xé `4QáØð V ñ(„øou…_/ÈqÓ}Z�°£Ì¤lÉ¢›nxÞÔ`kÉg¹?Ã!žˆ2©Óͤ'sݨÈfЯ�)„§`G×Û-ƒ~…L!Œ®?&œAä¾�C<fж-p‚ü~�LùuâôkdʯÓÍ _#SŒ6ƒºDuIþr†Pƒ­%’K€œ!Lq;+¹ä�\ìøVÓB.ÄgðÏoðÚŒI´Ãô�6úF~¥Óÿ[;ýmŸÿ£G~~Ç ¿ÿžÎC¼œío³6Vv[Ý1ÆÖõÊX¾TÈ{,÷ylsuíNemãέ¯Ö§Íµ/ŽU\»z{c=;îþ³b�-�-8Åò„¾4ÿQ[ÈTM÷?œ¿s+{íV.3;挱¢n�ÑŠwzÁÌ�™P% íDáÁßÕ2Á¥·—’§›’FÎkO©L¹sZfS«”66ÝB61©åJšUr4#g:ôÁªÞ0ÝüxþåË™Waºãú_l¤Ž�‚dïÿmÿŽ^îÛ¥Ù+·ýü~wþÃæ…rÆr;ÈÞDi�7‰™—0Ó»ßü‡w{×¶)°)x¡×ó‹sï³N Hï_�úµnwfÅžÉõ 1jù|h;‹�ñ±Ø*òE¶Ù-²y“iø•ˆ+4ÒñÂúßåêÕ±óÚë‚¡Û†/û\)[¥EŸº×Ç6-ma[Nˆˆ&p&ƒ=¦Ì[8ùÈý8‡x$hH_àònfáQ³½Ì²vÂî”aÖ`ÔléŰQó^ä!^‰ŸÁJ*_Èýqñüò…jêƒÀc°¥(Ôë�e· Óí~÷�ÖK¥Œ!÷'8ÄQÆ R¶hyÊ�jk¥¼¦k£Xr Í‘8ci?²ˆpöp„Ùå˜N!¬íG^‚})ùì"÷—9Ä#™]M?—NÃXàdA€x“¥Ÿ/ÏCî Äñä3¢�ŽŽ “lF~!¨Ï¶E•5Sµõ•0ÍíùA¶¥Ã˜´fú9]C<’šiQ¥ãUØâ‘—0 «yö‘j™µB#­[mqf£Û#íÓšŸ6`;ìöÈêfŠMNn ·Jð» ¼û^„]šúDÈáíC¤ãS[ˆK­2#Ú'€C°‡déïøåàì)å‚ߢ•¼‹Ù„'ÕˆÆ}à,ìYe:ºí6äNµbù#lAR‡|IzØ»CIÜ Î‡JÎsíFp8{"u·NÕhK�> <û|$š¦_ì^ƒ}-Âäh0ëw_$¼ûºz:*‘®78ÄÙÛ›ŽQlPrƒBröÍä{äþ‡x’¦q) |jמC}$ý³™6³zk­ÖsØ·�QßÒ*Kè—ÝÆÎ­tK–æ”4 ªÁ3\LjëÝc;.® Ÿ±úñùÏ|L¢þíœR½#­Í/¨>…ý4’z˜pœÕOl÷1îz˜ð«À}ÉGÕ>Ĩ6_¦œ­écR´B üÄê»(?ù(©åãªõõÑ[9Ä#I‡‰6\/ŠW(fÑ-Mײ«zEÏ:FE³½=ZÚWÓYÕ·Vªúgºç´'�^.òu”hÚupx¶ÔXbëLŠ1º2ª R9‚´;¢œŽ¡±ÊA/•>Q* 6ÊâF‘ úÒa`7ìîø ÿOÂ>©œ9â«é;=À^¶ãÊ›¸ ØQˆáh¤ì0½P�hË�rÈåQÄmù¾¹œpãMŒ�çaK�CÄï½Ss¢+:‰epö@$­5ýb7ðì ñØ£Üs±ŽŠJ½î×ûÙR±\²ÜŽ‘M’¥V _-6µ/U½@}¥œJ;@L‡€ßÁþ.�v Ó/ Fߌº¥ÊήE]›Ò‹›ŸüAê¹äŠFå¯aKA¤ïÀ¾¿ð:9œ„=™üH‘ÜßåOR 7ÑúËh(Žqx„ÅÕPì_|óB¸¥ : ¼[ªªo)öM¹„%èö5ØZ$Mýb7p¶t8úç—Xrw8 [.À:^"`€ [¹]Ú ÑNl/?Àþ ÌúÄŠ¹nXÚºQÉèŽYÑdš n2ß›RØÃ¢œQ 2v‘k/Fùfâ¢p;A,O'aKUØbª#w]À»°å*hþSáv‚ÜßãODoÐkÌ_…%@{]j±L±–©�sÛ»)ùt'÷{9Ä“4�.¤@€ñ”÷ŽŽŠN7PÝß l�Ý"C,”Ðÿ`‘²^që ǨØ[ÊîßVK9[†3âì*ì«ñ+š;�Û›¦ÛÃ$§éÔ¤Dî¯qˆ'¢·o]Ö++ޒͰ¥d-xí“Ê2VJ‚“(â‘,M­ªt(8t�Cù¥I ¶�rK”„›]°õãjv{¡Bµ¾‰RÖ�û.ñ(Ò8å¯F°·¬×�¬Sªˆänü »ýK– ³ª;ša¹™ö%¸DÝÁœ·8Ò%ÈmŒŠ�àYÓòºì~¿ÿ’-U*n"j¥JΨŒŠí9³°Ï*}¼´jRòÙ%ík©²fkùREsÛ‡r©¢W6}þ¶fæ5»Zvÿ†= ô69ÝýP· áéyÂǰ+¿ÈUšÚ­­¢ñ—ÈêÃåmú™@/F#¨Ú¬‹ íP%¼ [ªUV�æmX³ÛÀg°ŸÅ_’» àsØÏ•ó³IXWäÿð%ì—‘½þ�åu½P {ÿˆAc©vÈ}‡j�†ýªth+c;‡xSez-“,ßm5¼¦‡5_¢D†NÞN>s¹ ?B�±ÝY¨Ó>ç>3≨H^Îv¶b–ë+nwH�ê¼J¢Ñ7¶o/UO˜ó~ᬡZam4^n›ÕÍBÕm‹nÍ-º¨—&ÙZ�]°¥º–µÕ#=âIº ^„ L©²‚ë¡Hi\�Ës½Ö\É­W½ ¾îølDÓ-ͨTÜ^”Ûa¬è¦mä„kÓaP%TëCñŸvÍYë´¿Ys6Ëz°î[rãö"…�ШؿÛm-dÃQéjLqŠäçwèÈ]7ð ì3ʹԪ‘QÕ�AàeØr[µøO›‡hNbDT&—! Bn;TD2i©uXDµB|Ú�]°¥ä+¦rwØ [jÕÖuºÔŸ+ÖŠ;Lój šé¢ˆjÉ_AÔN¯ÃV_ø~Ø­e¼øƒ™m¸�®#îœ~)¶"£Î‚¡ç(‘‚ŠZ¸z¾.„�¬ÖÝQäušk8¼Hƒßzh_W Ë›‡§!¹Cq?`îÕànß½Pr¿%ú£àMxö}åwè&öhe²µÍR <Bc,ôúˤzãp`´SftòZ¶A—ü«5úivŸÈ}‡òÝo%H�ã™5k[,Y3ofu‰�‰4ûÒÊê•ÔFíª)F4z8Lip™`J2¾×7Ò¥q®oFJcß’xþ¼rÇB¤Ù‡çw{µÃ–Šƒ‰õËÈÝ~`ìå<9ZëÃ»í¶¥e„WÝÂ÷5ØštUU.EÈ[9LxŸÉHô‹ru£;ÐÂîÑä¸Ãal9ÑH%Ç$’`2Òä8áü™!Í‹áÓàB0e¸¸Þ\+æ^*–° æ¤w�€ú†?byøöÛëœ]V‚ž WPÝóG¼/ï–ZÓúËg€ï`¿‹¿6&w§€ßÂþ6ù†šÜ¿çORåû®/y£+ß�nuçë|¥T”‰üÝ尶ܨ,t-÷n‡35ì6—~à ìÁø…JîNÏÂV_dpÆ3ªE«žCÛªcQ!½sÀ'°ŸD^GuLË“æ½C¯OjÄ”ÖÁjÀk°£<ìa—ªø¨_sì%¸·ûØŽ$ªaúÅfàuØR!91ußó3ÙCn줨îf dU„k"q“ÕWKÃŽ¨Öi1íOe÷kæ†hÍC\ŸÃ–ZÎ!ž7SÀ°_¨")æ(‘1/�¯a¿Ž®9˜�~±8#“)ß¿ƒ-µ™O‡­¾ÏL¸dÍ#�Œ¦¾ðO¿³sR%ùÄ`D^ü�©ÿåç ˆ¶ÉýÉ:`‡Ûf [‹¿ ½AVž�}FY;âÇ?’ÿAàY¶ãrhñ…‡¡òhËe¦ËeÃÊ-I\O³1*W²?_ !w´€j‰oæ%§€ÁÞôèzT ºUöÁ–šóST(ùïÀ–¯À)´s‹B½ Dy.Bš‹àØÆ¢�ò6�é"¤¹ˆäi–NE™ x¶T�&&ÓEH“pö` 2%ÿg�ç`Ë~¢"}ìÅÞe*Ò%¨’0ÁŠt ª$Lµ"%§€ V¤KP%aš)ùïÆZ‘r •©HßBšoY¢é[Hó-K¹"%0ÁŠô-¤I˜fEJþÏã«H[s™'º£/¹ƒQA~ï IÂ.Ø]ñËó$IÈe—¼<‰ÀI`ì([‘ò|IrGn%.Oò ¨Ôˆì*ÏÃ|¤\�á·å·Èœ6&y³€˜@¿…(¿….šeu¡*Ðo¡�`yu/“Œ„‹ ô[ˆò[åÔ�¸@ɰ¶Tó¹«@[r™™ #[uD«Ï÷P$á ØRÇ剩ó=IØ[ªÖVU'èž„eél Î÷P$aìJ§°:É/P©pþÔ0i†Ž*±e†I Ê,ÑaÒ¨òKy˜ôYC˜à0éTI˜æ0‰ü÷X\äö\æ©áÌld�²Ä^ì��åGh¥MV+býY~„*šYsÌýi~„VNËjEL¢!Ë�LñÒkE‰~„4 5ØZM¼+Q‰YÑï H›øï HÂT›x"Ð L°‰ÿŠ$L³‰'ÿ½ÀøšøVO�oªFeS�ß2«_€™à~’\f)à—!Ëe–è~’\féà—!KÂøðuyÊÄ@¿gõÛHOÁŽr Û@£ßC—ß#mš¥ÓFQ£D ¨4ˆÓè÷Ð%ál¹¾ŸšFÉ¿T ÿT�iÎ^0ôܼU­D`õ{k 2ýQ¦d"½ÀƒL?@”„i™È0Ö ÓœýŽŽZ¤÷‰Õ/2N°ú Š$LµJº� ö@?A‘„iö@É/0Ö “üŽú¡ÊY¢A¦¡ÊYÊA¦‘5„ ™~„* Ó 2‘ÿ~à‹+È….vµ ¬PªÔ“U¨Uêi+T‡*õdªC•zÊ Õ¡J=V…öê…éEš�( ì‚f Ê K¹ šA ɰD» ˆ2ÃÒí‚fP@2,Î.èQÕ̲Pf–EptÎÏWiÊÌ"uš¥SGQ¥D`¨1…Xµ˜J³P&ašëëÉÿ 0¾õõ‡rÇËÌvæ IÂnØRaI1}æ I“°¥*oU}�`/ì(§Òè3MF·]S\Ÿäÿ4Pi&mW}áô)5 L ÛX´}±"5 L‰Ó,�8Š"%ý@¥Î˜˜H “Pƒ­¥ Rò8{0ŽÑÒ‚Q,­K­­ÏC•„ Ž–òP%aª£%ú©SÀGKy¨’0ÍÑýR?P©€þT3¿hX9™IÏh’0Áf~š$Lµ™'=À›ùhr…¥ÛÌ“ÿÓÀX›ùš>ešùUs•%Ú̯B˜«,åfžôlæW!LB�¥×Ì“ÿ3Àøšù_¤‹Žît� Iº$LpfÞ„.M–ò̼‰Bb²DgæMèÒdéÎÌ›(#&‹sfþX.óÖú¢wú m~f‰§ðÚüÌ�SPÕégd¡Re"¦ÓÏÐ&áYØêǦ‹ë”üŸž‡}>r�æ�id¸Q&¾_ƒ( {XŠá{"Ð L0|¿Q¦¾'ÿ}ÀXÃ÷u�ÊtI Pf�%¾/@™–røž 5–Xø¾eF¾>á‰Ürˆ'¢·§#� º3ÄóK¼tˆ'é(úe«†x$KéöÒÙ~È• G‹ù‡ÚY�g+‹²§sЕ¨E»txÞÔXT'áL²PH<#[XB¿Õ´� ñüSÂk3}Ò7Úèmø•Nÿoíô·}þ�ù=ø‘€úê\“~ˆ—³ým¬±rÅ\w’cëze,_*䌊=–û<¶¹ºv§²¶qçÖWëÓæÚÇ*®]½½±žwÿY±Æ–ÆœbyB_šÿ¨�-dª¦ûNŒß¹•½v+—¿™sËÅXQ·Æø£eGƒ|¨‹vbñàïjùà2ÜK)Ô¿ML#çµ§T¬¼ãÚ3›Z¥´±é–³‰I-Wò/TΙ}°ª[�VY6?žùræU˜ô¸ª‰¿Ë8�A�‰ìïý¿íßѼ]š½rÛÿðÀï·qç?lÞQ.g,·í0­•zö$f^ÂLÿí~óÞ0¶‰°)x¡×ó‹sï³N Iï_�úµnwVJ$Ÿ±’°–ч¶Óø�­BßQl›Ýb›7©�ßð+Wj¤¤+â ”õÈÕ­ãçµ×C· _÷¹RÖ»ÃÒ»W3-ma{Vˆ‰&�&‡=®L\8ýÈýUñHÐ�_ûúnfáQµ½ÌïЃ}L†Zƒ>eýrÖn÷�Ã>ž|Æ�ûâù%d ÕÖ�ÇaK¥P¨×ËzÁÔÃnÞ‡ÜØ‡äØ#�$J9Cî»8ÄQΣ|Ñ*F±äZIjÑø~ä a/ìÞóÇ1�BXÉÙ�£œ3�Ú�IÑ­TÉ•aá;ñ^ƒ-Õ0oáu©ä�‘®SäÇ+Ú%¯K…îÿÉ­…JŽ6$È÷$TMx ö¥ÈdÕ0¼ÚPNÄã*‡Ò‹vÄäDî.'`«wëZ‡ƒáš¨ŒNB>„÷`Kͨm ¼-¹ãNA&=!·J%ÕÖ€¸v°ÚÔQÜ"!wû�G`QΔcÍÜÓ¥Ðt9tÁíë k†hÃV¦woFÏ®"*ᇙ]žÄ�øÚUÓË@-_ªhUÛÐt.šè~Yð ¸C±=Õï‘Výn‘ÓÞ|÷ŽS­„ƒ‡ÄòGàWØ_#Tá.ÁÃô ªçrï9à÷°¥c|;~ù1pöFüå“ÜM7ao*ñè!ùÿð×°�JåÍ-U‹¡ò–ï4ŸCÀc°£\ÿÚ@ ä.XÁw¶úú×.®×µBiÅÌêaѧÀK°å:bü§½ žúðÔ¥j9ºéöK–¡UJ_½šÛàªø!;»jõÍ«ØEß‚ÛOÉÂ~¨Þ�¢ñÒºi|m¸ä¯Ÿ>p æÐ¥Vrmáó„ Îç+¥¢ÏÇÅ!3�øæ0M¼Ö>^)”2z¡>-+ú&ý`Oøöå79éÑõ™Sÿ£h:ŽË\X½`DÈ )T‡cþ©¨šžËIÎEjàBØ »3òÅ1ô(êm…;Dð*ð1ìÇÉt&Žø� émì«mŠe£°G#éGÐ/öŸÀ–Ò¼X3AîŽg`Ë­~ØâÎí —z¢0 |û™z©/ëÇl`͈ß8—ú3(Q„Ñ•úÑiw`Q*Yncê.LÛÛ4°îÖµê4Xé" ÏA¨u�¬Z·Ž’Lo!ú2ÜŒ{ û©òËշΩ +þ2¨r 6iÍxci{µT-ä4Óʪ9cgÓ4¢eªŽw®­æª5ö=»fX9áÉXîH¯/º‡EÑí i.êšÙjA^|D;`wDVå\x©WLýÉ# V'€§aKmŽ ÷º\^[iàõ°v_ƒñ)b¢Ð„=Y¶Xx¹¹ø¦ÑºíÝ8 ±ú°È”³ÀQØê�ü#ÃA§Ó«7…«%b3¼û¾2«Ã�KE·(»�;·§,Ȉ)®oØ-<ÒÎ_q#…joÀŽrÇÍ.‘‘¶)…Ëyˆoð<ìhv`Ñ/Þ„}3þþ,¹kÞ‚­¾ùglÄï„`9´7‚6¬jÑ;°Çö#¶€…ÛO"{˜‡�W&ýÒm>ý8¹ÛÞ·`)ØöÍ9fmØâ dýuÒÆÿc(¨„/a«¯fžó·‚ ¥¯¶fl” n¯Æ;ÆíGnéÉÔz“ëºYðF�4Bw»�Ùj¥â¾­èëŒãç`Ï)¿ÎãªmTFÐM£¡­«.Ûð—ödu÷­,7Ÿ2rÄ"¬˜ëþ7 /E_„üz!Ü=L2„»uãjmÆ@X( AÈí²Mzv ®ŒfÈvg¡N›6™Îrˆ'¢Zöðrΰ³³\ßn¿c˜H uC%ÑèÛO—SO¢ÔġڀšþëÐc|fÝê¥Z1´¢Û‰¶½Ô*¶»`wÉP =ÀA8ňF‡x’.ˆ· ‚S È܆ëÛ‘Ò¸3miF¥RªxÓºéí^\5,·¶/üj½ÞË ˜§®e n“�¥”ïlµéwqk�nzæâ1ÂUþ$r‹—“Îâ»p t‡z¥Sc³ êÍ›ðvOÕ³Z�û&åëH%SH�åScתz±ldÝNnV—8;†ÂÁ¹$êUõ=Õ#=¦TU?@f˜’ŒÂõÃHiȬd›†wÂèW²í~ÔCÉ%"sx„ÕÎ(‰{ Nîö�ÂVo××![9*ʆ7ËêÈeU'ðìè¶È­'.W�7`GDÚ%§.o–ŠÔlË)oÊMs¿ÄäVë­[ÀyØóÊôÚ¼Î•äÆ‡G~–{ŒZÚ”)�žõ;|Èðæ¸½õF^¯QysCû°ë#åݶåœCQ™§³À1ØcñËœÜõÇa�+gÚ�™Ú‡[<繫ÒE.ºÚ‡¸L§aO'“-·€�`?J¾ñ8üQ¤qÔ«m?¢·ª¯ …[é£8Iz¨bmm¼65¥ÍN¿XœU ; †=¿jÈ]'P­ùæ?íu{•Ša—KV.û±}Q9¯Ë@ÎVä×^["å-ÛäÄÍÌóÇ)hi·eÆ “iDð ðìjê§—KϧåSÀK¬¶QBŽúŽ_>|ûaü�;XÍk:˜d«°u}˜ðŠXòÿ4êõ³p31‹r`zcMn%S cM¹.q9ì`‰my%wû�GXT[^O›�h&.cxËO%7x±£À`¹×åÈkÞ¨¶ŒËy`¶Ôl´xõÉ–Qâ}ø¶Ôy^¡¿<\�½’Œ¾G€«°WÕë`áa/ù7�ŸaVæqÑ_ûmÓ(·”¯­òF©Ã)\⫆¾ñKˆ‡ÜêïˆË\/Êœú)�Äó%0;¡R×í—:Õƒ‰ùuà3ØÒ+Øwüò(pvåŽÜ Wa§Qî¾AYû&Òr7:Dñ¦`ɯf:ZQ÷V›dKÖºa™t:‚[ìªÞ‚áîÉŠÜSÝÁVìš½b7—“ 5äÂI”±ÄXŠð à$ìÉHŠýâð lõêqÍ»ÚÀ_^îÍe›ÂCgb4|û½2³Zì^1¾TÍŠ‘k|+K#RÏ aÂØR=[µáw*j„Ã�Öw~”Jü,î¸TÅ�ëÑ BˆËQà Ø œ"Hî»XíÅ¬é æ»¤#ˆÄ§8[êÞ�ð‹›·D—Þ ‰×ðìÉd×0ð!ì‡ÊÙuÝVÑrM,¦�ßÀþF™M;:Ϻ-Ó‚s«v# nù–Üd6‘9ì…Ý¿ZÈ]ðlõ›ÕúêÇPÑô¨…óòhþO|¼CÔNoþYv©íJ¬°úÁÖ°“È·;ÀW°_¥Ðƒ'ÿóÀ×°_+ó8Køm{÷·Îè¢*zå罇ÜþˆTÔΫH\DDêðl©½b""w瀷aË•¬-%jëD¿¨¢85{ñ˜;LvSk„µ3ɺ¨t­ŒXÍC¨„Ñ-Ç8V¯�mÃñö—fjj°µ”»ÇÄå"ð2l©X´x�ŽÀQΣv ì_Ý–S¸‡C\®'aK�®#>xŽø«�æ`Ï%“Ew�Ï`«ã³O"@ ž_Á–k¶CË�ÔB‡×̯Ï<ÜûµÿFw¸wo^¯ÒøÀ´‚egâÝNâÕ¼û‚RV…eÙq„Ùg6Üîƒ-wx1œ~€ý! Ü%øwÔ°sì%¸_>†-¸ÜñËW€aLFÖ�ßÁþ.‚>Õ×U3»lt­vˆÌ2ð3l¹8{è…r2Ñ‘7̯i[™Â%¿bÙóÆçïat›2ÅÇMäÿ0«_*w˜Eѳ». ”»†zÝm§Ð}x[Tõ¬–侉C�m®®Ý©¬mܹõÕú´¹öűŠkWoo¬gÇÝV¬±¥±§XžÐ—æ?êc ™ªéþ‡ãwne¯ÝÊåofÇÜr1VÔ­±-Ç^ŽQ%íDãÁßÕ2Â¥¸—’èÔ65�œ×žR¹Òé2è̦V)mlºmbRË•4ºdÐÈ™}°ª[�VY6?žùræU˜ö¸ºÉ»'è ÈEö÷þßöïhÞ.Í^Áí4~¿�;ÿaóŽ‚9c¹�‡i­Ôóç 1ófúo÷›ÿðîàÿo› ›‚z=¿8÷>ë¢ôþÕ©ÿPëvgV"í/ƒ©åó¡í,>ÆÇb«ÐwÛf·ØæMêã7üJÄ• é ‡xaýßäêÖ±óÚë‚¡Û†/û\)ëݘ£{í�ii ÛrB¼@4�3áì1eÞÂÉGîÇ9Ä#ACzÙÖ»™…G!Ìö2¿;KØ »S†Yƒ¥¥Ãz”{‘„!Çÿ&•/äþ8‡x~ùB5õAà1ØR êõÀ²^0õ°£e÷!3ö!5öH§ˆRÆ�ûâ‰(c:)[´ŠQ,9†æÈ¬vÜ�,!ì�Ýaö8¦S+7û‘%„!»ö’ÊrŠC<’ÙÓôsé4@ˆG1YNòå—Nñ¶F´ÑÑÆ×?7¤×ŒœÂ|«gŸŒP-U[_ SKÐrd¡ÃÖ¤ÔrÐÏãn¶ ªå€*¯jæ�¼xYX³�ô"Ȭ•Õîè »¯çç3ca Õ4­Iði¶Ãn�®ö®åÚt�àwxö½;/»\Êu|Jýˆm¢}8{H–þŽ_îNÁžR.ø-ZÉû G—‰Æ}à,ìYe:º]¿°Ö2 ’ân¦òÒg�� ân°H(¸¨¥Q´w7‚CÀ Øɨ»uªF[‚ôiàyØç#Ñ4ýbðìk&GƒØ÷!|‘ð:ìëêmè¨DºÞàOdoo:F±AÉ ÉMØ7“ïA�û[âIšw…¦bj·žÃ^·�)HŒ°Ø»Eºã°�Ðÿ Œ²Nw„;FÅvM›®þ,Ytç§û·ÕRΖáŒùØUØWãWtÜ&œ€-U«ªI‰ð‡x"zûÖåàöé°1~ ^»]YÆJIÐŽ2 Ú°à˜*êäP~ Ùà€9n,Ù¨+ÐpI_j‡-–küŽ@„'`Ë…a”²†¾ÓÅ!E§pÑ+]_¼êÖmY·jÓÖÝ.O©"Jð(Ò†0da±,AgUw4Ãr 2MÙÞ%ò~¸J”`'HuFJ°U·rÚºi|æÃÅ|k} ©‘îÖõ%¦Û ­ZNwSI· ác¹ˆ'Ÿ§Š´:ýR¯é¹œÛhÒ5›š /®ì…]ÑXåîÉæî!³Á«Àǰ'3f9â_“-½Ž(Ga�F2r¡_ì>�ý$þÊûÊá ìe1ï×ôŠ!Z®ˆÂ,ðìgêåÊí‘:Z)ï•ù‚Ûº —÷.”¥.årÅ::mkvÉíë~m­™¶7Ù°î–þ|¥TÜRG SºÁ³:Ý#«Ó-œo˜ѤõO;¹RÚR:œÑ '7ûö°{˜ä V­;Ñ×FÓÿ}¼ä¦”íŽ�4½\.˜n}ïŽ�Ü1H¹TÑ+›H2ÍÌkvµìþ @”š+nÈ«m÷0ÉÚV-=¹E„éy•Ò³ߣyd›ª7ùL¿TåK�Vå›ÖŠT£Ê­·õÚ©=LrÚhÓÀ¶£*Ä{ýÄì6ðl©jS¬á wÀç°Ÿ+çg“°¼Éÿ àKØ/#{ýËëz¡öþC_¤z.V侉CµññϾ¯¾�~æÕÄ£˜*O0£Š°êï² J»Ûâl™£×ôlÖ°m“ ¿³Z)UWV]4…ÈSÂ'°¥úc[W{dk³AÂJ×ÀBc[‚ŒŠŒæ—ÜÄÑìÕRµ�ÓL+[¨æ ¸¦ÑÀ­Þ6ùÓ:öˆ–©:Þ*DhÖûŒž]3¬œp2s+ÅÙ<ìyå—êryÔñ3³Õ‚^ÑI ‚È ‹jÖ‡ÿÖÁ…—zÅÔŸ<’`uxöiVá^—Ëk+ ¼öÁîSΠýž¸$ ŸÕ—õÃŽ([,¼Ü\|óB‚Óð l©5�™M4 [½{d8èvz5¦pElÆ€÷aßO¾IäöðEØ2³ÝY¨Ó¦í~3â‰HI‡—s†�­˜ÜÍ%;nJ¨ó*‰Fߨ¾9@=aˆR‡j]ú¯C�’™ÕÍBÕ:Ýþ®è"� Ì�PvÁ–Š=‡®ÉN1¢ÑÃ!ž¤ âE¨ À”ºÈCp=)�;Ó–fT*îð’7ºIS�_W K˺ý"mRŠiOoªkÙBÉý–(ýaP&¼ûŽ2ýn"n­Ó9ÝšBŸôr1§¤³ø2\(�Å¡^iÓ_¶A½yÞFT=«%¹oâP¾ŽT¢ÁïþP_ûð³G£ c#Ô7:Ä!žˆzŒ/ͼ6T1¾TÍŠñŠ£e=k .¸½HÓ1G4÷Ã)ljSÚÒÂÛ™áa/5]uJåŠi9C¿ÖÎjƆ^,»ÃÖ¹¼è»�á}ßÃ~™æ[–s%Ëq‡…_¸ÞüûC|jÛ5 >rˆG‘Ǹ[j÷®hõEyÈÑÉI‡†G´ÁÉ¢Q,U6'ÅWz�#ÉÆ·Ú‰'ÏŒ°îêܾ ^<�&@†°“Õº’ŠÄÎm™´t‰¹¹Xt²zÅv‹ªoˆS½z„ç`Ÿû%¤áu�¹iŠ‹Œ›Â‰Vdõ»–åè&ÈÜTN Ð#«~3¬T»ó {aKíá¯Ýo!1£["®òšC<‘%A�9 ú ôÚ·#­pwŠÜ7q¨6ò�T¥C£�Vñ(¦Ê€¿p4ü\‰IM”ä$²‹pö€R±n´ FqcÇ]æÇIî²ÐÓ¾"\³Ãm3Pc;NûŠkºð.²‚�‹ù+jGü #ò? 9Ü]bSbƒs‰§ËeÃ’:ÞýÄ@ØÃvœK—0îA „!çËæ�ø„68 9—8.…Þƒ* ƒI]õ‰q…’ÿ~àÛq¢hD íÜ¢P™c¶¦ Í)plc[λŠK¦S�æ’§Y:yeJ4à¶ãXɸd:iÂLA¦äÿ,ðl¹�ÏOT¤�+†.·Xó>TI˜`Ezª$Lµ"%§€ V¤÷¡JÂ4+Ròߌµ"å*S‘>€4°D+Ò�æ–rEJ4`‚éH“0ÍŠ”üŸÆW‘¶æ2OtG_Ú,‹Ö¢!IÂ.¶ãêõ¸äù’$ ¹z=9y�“À¶ãêõ¸äù’$Œîqy’ÿS@¥Fä§N%®ÇóNC”Ó,ôTâ¸: QN³ÐS‰“è42ÍBO%ŽK Óå4 =•81�’ÿ>`?Ûq*qDmÉef6ŒlÕ­>A‘„'ØŽk­ãRç#(’°‹í¸Ö:9u�n`ȵÖq©óIØ;‚Ò)¬Nòß T*œ?5LšÙ0mÇ–&=†*³D‡I�¡ÊÇ,åaÒcd a‚Ã$n/NªÃ$òß`q “Ús™§†3³AÇ2‹Ÿáô²|­´ÉjEL¢O Ë'PE3‹b&LB¢O Í',ô.¨¸$Êí{¨-•kZÕ$ú„Õ÷ahlljöÑ5ñ®Dç¬|I�Þ I˜`?E¦ÚÄ�n`‚Mü I˜fOþ{�ñ5ñ­ž:e$gY¢øYHr–¥<€Ÿ…,gY¢øYHr–¥;€Ÿ…, ãÀwÔå)} ]>e¡W´Å¥Ñ§ÐåSzE[r%}@¥A¬˜FŸB—„°åú~j%ÿP)üSA¦9›.µž· ¢•è7%a‚A¦o JÂTƒLD ˜`�鈒0Í ùïÆdš³ßÑž AzsP$a‚=Ð9(’0Õ(è&Ø�ƒ" Óì�’ÿ^`|=PÜT0k…œèb·gå3–hõù ¢|ÆR®>Ÿ!Wž©æ�˜@ŸA”„iVŸä¿_õÙ¶åî%AŠÏ¡Êç,Ñ(ès¨ò9K9 úÊ|Î�‚>‡*Ÿ³t£ Ï¡LÂW ]0ìjAX¡/ ÊÉ*ôTù"m…¾€*ƒÓ~Rè ¨òEÊ }U¾ˆU¡GwœH%Hó%”ù’…Þ¾—J_B™/Yèí«É©ô%²‡Pc ±j1•¾„2 Ó\_Oþ�ñ­¯?”ËÐ8^f¶ó4IØ [*,)¦ÏWÐ$áIV»å'y}�`/ì(§Òèó4Iݦ2q}’ÿÓ@¥™´]õy„Ó§L8tœÃ6mS×@¤óæ<§Y:qEJú�Jm�˜Hç!LB ¶–‚HÉÿà ìÁ8:£ Þ!®2Õèk¨’0ÁÎèk¨’0ÕÎ(8L°3úª$L³3Jþû�ñuFÝf~Ѱr2“žo I›ù7Ð$aªÍ<è&ØÌ¿�&ß°t›yòk3_Ó§L3¿a.°D›ùs�¥ÜÌ�~`‚Íü„I¨±ôšyò_3ßá‹tÑу.û$¹]&83¿].²”gæQHY¢3ó‹Ðå"Kwf~ed‘Å93,—yëë,wZ‚6—X¢Ç),A›KLñ8U�.!ƒ•*1�.A›„ÜÁ«‰ë”üŸž‡}>r�V¸:æ-DI˜àè[ˆ’°‡¥8Jz� N�¾…( Óœ%ÿ}@¥vä§Â÷u�ÊtIßA™ïX¢áûwPæ;–røž 5–Xøþ”I]ø^ø„'r?È!žˆÞžÎQ5èò ÏwðÒßñ$�ßúe«†x$KéöÒÙ~È• G:ì³8;ºžÎAW¢íÒiàyPcQ œ„3é= I€gd Kè·šr!>ƒ>൙Œ>éÛÏG§¿µÓßöù?zä÷àGê«sMú!^Îö·±ÆÊsÝHŽ­ë•±|©�3*öXîóØæêÚ�ÊÚÆ�[_­O›k_«¸võöÆzvÜýgÅ[[pŠå }iþ£>¶�©šî81~çVöÚ­\þfvÌ-cEÝã�½ ò¡J,ډŃ¿«åƒËp/¥Pÿ61�œ×žR±ÒquV¥´±é–³‰I-Wòn-1r¦C¬êV£U–Í�ç_¾œy&=®jªùo[dPËìCÛ©|Œ�ÊV±ï(ºÍnÑÍ›ÔÏoø•ˆ+6RÓñêú¯rõëõóÚë‚A—ôxÚÏ•²Þ¥Ïº×™–¶–âE£ Ä ¹ÃgÉ §!¹¿Á! jËcÞÍ,< ¡·—ù�[Â�]Q?Ÿ^ƒþ%]ŠÕÀí wÁbÒ™Cî{8ÄóKɪ½O–J¥P¯–õ‚©‡7»9²�…®#O*wÈ}/‡x¢Ê/o4³–9¢ýÞýÈ‘ý1åŽc:…°²³9²?ÝÜÙ� P-wš~.�†#åÈ‚ñ(&‹¶óFL:hDÛÑFGGÅ�ùnFŽ!0»}Ì¢¬šª­¯„©&hϲÐmRª9èçu · hUÓ¢JÇ ¢rˆG^Ä¡w9í#É2k…FZ·ÚâÌB¯pjšÖ$ø´Ûa·GVwz·¸o GHð» ¼û^„™].q?>¥~ú6Ñ>‚=$KÇ/w§`O)üÜ¿)w&÷�³°g•étèvýÚew4-Hê�/I;`w(‰»Áò¡à—FqàÝ'`O$£îÖ©m Ò§�çaŸ�DÓô‹]Àk°¯E˜ ¢â‡ðEÂë°#RŽJ¤ë ¥‡” ÞÞtŒbƒ’’›°o&߃n! OÒ4¸�ûS»õölÒ"læ�d·aÿö–nZË®ê=ëmÝ­J•M‚aЙèƒÝ'�pÛl¯ø•¹„ç€`_ˆ¥nÝá¶xöEeïÓJÂ×K/þYŽ4͉ž@8¼;ÊÚ}— ^‡­^» £¤9%Í[Q¤¹]•zÐA´î'¼ÁêKànøwÝL+š°Ä&éJ7X¯ ž¤i´#Œ§îß;:*ªê»6[`·H×þÛ �÷oFÒ++^ÀÞÖÊî8Çío—,·µ¬-Cù0pöxü‚æzùü½ƒI+‰ÜOpˆ'¢·o]®åUˆï¼öe+%Á�ñH¦.U:G™œ P>ŒØ`aéöpb£¡`Ãb'ó 6aÛ±‚.®ÁO'$Br~œ¤\.aØnkºUk)WuG˺ÿž1´lɨdÝ:Æ­`3’xž¦>‰,#[jý` ZÏ�‹°£lÀtnÈÝ p ¶z.¾ì�ü¿¾ƒýN™Ç™RÞU�¡ÙzÑÐ †µâ¬R7‹þdZåª#|�8²ÜÃ�õo’4ŸÎÒ½ë–fËÎæŽ‘”C{¾jù«±jå/teåCøeŽã¹ö_fjÉM]šÞµ5¤¾—Ôµî�kZ¹bØFeÝ-À¦å}§TudòãhNÁVb^úvÕ°¼^Œi­xôj1DTEúŠnZ•O8^‚}éÕŠ³«ÀǰÇߊ�»ËÀ'°åjeþSáVžÜÏpˆG‘Æ^·Î$Ò qr‹""JÃðQCY�VñÄ- r·xö¡äeAîs(?Èz.¨G4ÓÑLn¦Â­ëWukÅÈ WˆÜ¢™°{¾%™ö¼F]èW^ÍîÍf‰Êº”z˜ê…0Yôf Å#}Äd8{<–¾×ŽY”f¢,ÇX^€-›ÜñËÁFì«°ÕÀç4{µT-ä4ZV�SÃZT�:1œ¾…­ô™¢ÎXFÏ®VΦ‚YÔ7iÄQ,Ùîè£d­–Iݧö‚¼¹A’Çy“ÛGZ‚Ë_‚ó9ùø .Äôðì‘”úÅk¬~æ5•L�Û¢B'Á¹‹JCÃ-tn¸Ö³«¦±nø#ŒŒ±ª¯›4s“©:þŸÜÿÑZôŠñ¥jVÜ"ÚpYS#êÜÙ ^Hz‹rJòÀòº^¨†õŽÂW°“.¥¹oâ�dQoU¥CÓjíâQL•»�õBÁ׋륪q›ÜaªíTüa”îurìªéÐÆ -_ªˆ¾@?²’�»©]ñVm¤ºT¿Ð !ÐÝš¾P-Z4kæ³¥íˆÏÖ× ÷%*†ÿF›¥ªè[ €9áCØ•ßâY-É×édnÍ­P5ÝʹCmwD YÝ&ŒþnZŸ±·Kw·©³Gµ%o ¾nTlCô}4¼!w’¯âû´•Êô:Þâá~&›áç¨Úذ¶öDÈqÂKxˆâ8ð l©‘¯xÃ{|Jý<¢Ý ¼[j/Hè/ÎÀ–‹‹ 9É];pö¬²š›„»·ä?¸gâØß$ß„ ¢ôMKÊvg¡N›ÎxxÆ!žˆÄsx9gØÙŠÉÝ·£¡ÅÈ[>ÑèÛwaª' QjâP­KBÿuè™}³ºY 6²è2Ñ5¯´&°Ø»K†"‹d-8ÑèáOÒñT`J]Ú‹p}1]Cp=)�áiK3*·ÓGÑ8ݤU &?‰áŽÿêFi‚t‡Aqx«ј¿éÕt£V®Q<!.¯Â– óˆ5®äîpö„zã*<ÝHþ¯¯ÃV_ÓÕGg0çùù<ü#ÜþsÓCaGh&UÐ.Ãu€Ò-Ô+µ‘mЈž‡·UÏj @î›8”o0•h\A ÏÚ²¶Å²‘u‡Y]b«Í(óÛjBõvû¬jŠ�Sj·Ç�Y¦$ãq¸�”ÆAŠýPtG� ·´®¶óPm5UèV^/^¿ñQxlNôÎoÀŽrGÅ.cóvâ.}—*>„=(K|Ç/wo¾Ç�ܵoÁVßÝqÊo©÷Ãr÷OEÝ‘Qômàì…Èzx‹3/f/iWµéEm—õ¿  R€+°W"Ì´u£’iàv¸ {5ùª�Ü›âQ¤ñ¤¾+§;º–¯Ð"³¯¦³ê�jµ­êÇØr#ZF`™âÉÂ} _>�­¾JfÎ[4”ã�<–YViD+æ¼8…“9ú6Í)œLÅÇ4lá^ø5¼áì9å×é7iíVÅ1³Õ‚^!Žà§Ì5C´\sGÄ„Ý-Ÿn¹&RçY}sžE»#¦A¹&w@ÎNº\“ëÊ¡³Å©\� 7µÉöÁÞ™HNC$—´Ù…ù—ÚP ™a ÅðûC/À¾¿bÈÝ~àEØê›Úăêä8 [.Ãú Mžaî³Xµª6½^EÉ¡¾qÑ %.¦]¬Í�VÝê3c®TKU»°©åÌ|Þ¨¸u¯èÛ܄ԹˆßæQ¾R*zmØÎðÚê3ùA {D³Kþ[�(ªcEßã¸>‚ý(²âsåÅ-,Û *݆£‚eˆºvÍÀ‹°¥Ä,V†n#en³-áϤkÝÛ(:GR„&œÕJé«·ÛX¿3¾¥»�£ÝÞyvU¸èßA’rý¨¤“o®Œf~‘«�¨ëæï(Ý’xTJEÉrk,øÀ¿"ÙDÑ5›‚Mz¡¾ã�V‡dWývYÏÂ]Ê{`Irð¥$ãf·�_?Ó„Û‘ÀŸï¤H¦…§‹º0�û @Ø»E™Î€[X=¹Ù~ëà-‘©¬-„(É F8{@™äªQêÃá¤{&kß÷P5éPÉÑø1C_ÚÕr¹Tqlo5•p 7 bÓ‘&Ý�9Ë­•7ÝjÅ6FÜ¢jdׂ]1ÞB#Ó©ENê),J�kõÕÖ n¡~‹ŽÝ�lÙ¨P\ÇÛ•ìv¹¾ÒcÃÈV½:/²x ªÁF„4i¢5tâqAþð¢ˆzRQì/"f�Às°¥6(4è<5ˆ’»ÃÀó°¥ÎR€�ÿ À‹°Õ[Tá^È ´`r³z£ð6«êY-È}‡x’¦Ám»TL *¯G.�†¥“F‘‡8Ä£:¢<«½ÁPÒ°hé¬�1c%c:Ý5ú«+hu°ž÷"ðÚÖ5¹Â/Â…‡”ü§—©+­Ý»¢ .”2FŹ8|W{²0ÿZ[š~ôbF[tªT3Úw¯\fÌ­œå'݇œS:ýjqnhxĈŸSúÔ5ØZ|§!þºûèê‘ɳÚ[Wxs¹¡aêÈz”¼Û¿ñ8q{Ýå’å�p S¼ÍånŸ¨¨ ¿ÀK�&ä…Š/pÏÌ} Dê¾…ÏM›Ò}Ëûlpñ|÷ÏžáÿU\ ¯@›�x)¾ÂA¼‚0�yP T›Tæ?=Û¸�¨x½;Â�ÛÈ+Doà;Àh ÑèYoVÈ?½Àööûë…¯úfí` ŠõTW¼d6 îzç`ЛU&Ý»®Wj%Ç¥?4h÷ $Š'bt'¢´…ù,�atãþs�ËEÀT<éø[Т۾,^0ÞÁw€ÑŒëgµ%›TO7ëA“rÅX§}¥¹R•êfÃÎêe·Ç$L=¸™Š�›¼T¤~·qnÿDC\üõMJ»¼Bݶ,z±\–¥ïèÿ’»‘æ»ð°€Ü7q(?:¡aÁ¤*��Ì_Ì ôá[£_þ±qáw�Mj¢$¿CvÀP }„†@Ô�ô^fþ–Žezl\'=‘»f ÆvÜWàeYAxöõÀ‹p¨ŽüÏ–ërív¯e[.3].VNææÕï!ÂØ=ñ ã{ˆ�°¶zwEâNK"p xöéøú=TIÝB{q…’ÿ~àÛqË|D íÜ¢P™«W€4`õƒŠûã—é�æHžféäQ”)ЀgØŽ«Æã’é�&á ìÁdJþÏÏÁ–ë¢ÿDEú¸bèrWX‚* ¬H?A•„©V¤Dà0ÁŠôTI˜fEJþû�±V¤œBe*Ò!ÍY¢é��æ�,劔hÀ+Ò!MÂ4+Rò_EÚšË<Ñ}i³,Z‹ê�$aì®øå©C’„J7OªÊ“œöÀ޲i O’$Œ.z(.Oò ¨Ôˆì*ÏîwhK.3ã­­>³P$á Ø'âWgŠ$ì‚-Uk«ª“tOÂŽ²t6PgŠ$ì�AéV'ùï*Ο&Íl˜¶cË “rPeŽ%:LÊA•9–ò0)‡¬!Lp˜”ƒ* Ó&‘ÿ~à‹k˜ÔîíažÙÈe‰# ÈÒ€VÚdµ"&Q²4 Šf&[x%j@š´rZV+b5 Kƒ©nzT“¨ij°µ8šxW¢sV¾$H/E&ØÄç¡HÂT›xú©n`‚M|Š$L³‰§_êÆ×Ä·J±I®°Dð+�ä Ky¿Y®°Dð+�ä Kw¿YÆ7€ï¨ËS&º ]®‚`›lÓè*t¹Š´i–NE��> Ò VL£«Ð%ál¹¾ŸšFÉ¿T ÿT�iÎ^0ôܼU­DMˆ’0Á “ Q¦d"½ÀƒL&DI˜f�‰ü÷c 2ÍÙïh7� ½ÏP$a‚=ÐÏP$aª=P"Ð L°úŠ$L³Jþ{�ñõ@Ýêó…i;³¦Qȉ.v[ƒ(×X¢ÕçD¹ÆR®>×�+kª9$&Ð5ˆ’0Íê“ü÷ã«>Û|�Îû׫R,@•–h´UXÊQДY`‰FA Pe�¥-@™„,®((º`ØÕ‚°B‹Pe1Y…¡ÊbÚ -B•ÅdZ„*‹)+´UcU(yoIT DI˜`#oA”K¹‘·PB,–h#oA”K·‘·P@,g#(—¡!¼ÌDg š$ì†-‘Óg š,¡X4Ë U}–P@J¬~·c”³h ôY‚&KlËEp‰ë³„òQbŠ“h»êó§O™HhÂ,ƒa‹¶•k Ò2„YFâ4K'Ž¢H‰@?P©™iÂ$Ô`k)ˆ”üŸÂŒ£º`KëRËê¿@•„ öC¿@•„©öC‰À)`‚ýÐ/P%ašýPòߌ¯ê6󋆕“™ï¬@“„ 6óh’0Õfžôlæ+Ðd…¥ÛÌ“ÿÓÀX›ùš>ešy´Y¢Í¼ aÚ,åfžôlæm“Pcé5óäÿ 0¾f¾Ã颣;FѰDÖ;Ð%a‚“òté°”'å‡%:)ï@—KwRÞAqXœ“òÇÔïž­B›U–èI Uh³ÊORPÕiD¨T™ˆé´ mFwz•¸NÉÿ9àyØrgzþD`ôÛŠ)·y¢$L00ºQ¦%½À£ë%aš�Qòߌ/0z”¨L—ô+”ùÛX´‹Ì¨ô+”ù©Ó,�:Š*%@�)¬2SéW(“0º“q„w"÷ƒâ‰èíé(`C/Ø¥ÏñÒ@p4ÈŒ*Qi'*þ®–.ͽ”LýÛ5r^{JeK§›ì2›Z¥´±é¶‰ÉàÖ#gz'ê¯êV£U–Í�ç_¾œy¦?®~ »W$ÈIö÷þßöïhÞ.Í^¹íxà÷Û¸ó6ï(œ3–Û€˜ÖJ=�3/a¦ÿv¿ùïÚþ·mJl ^èõüâÜû¬ÓûW§þC­Û�•“Éìnw¥¢j9}h;��ññØ*÷…·Ù-¼y“zú ¿qÕFRºÂ!ž@ZÿM®†½z^{]0èROø¹R¶J‘ ï^g:X}aG^ˆŠ&°&¼ ûª2sá$÷â‘ Ñ`+ŸN�¸5¸+l/ó;¶„Ça—áÖ oIG¬6p»xö‰äs†Üwqˆç‘3Tcž€-•D¡^,ëS;bv²cÒc�tš(e ¹ïæODYsÜË­àç ]T^U¶™Bx ö©3È1�BXÙÙ�L! ‰$•Aä¾�C<’Ôôsé4%@ˆG1Yú¶–á!: hDÛñîeæÈ]²6U®,™ª­¯„I&hƃ[¶�d“’ÌA?£k¸m$+(™U:^ô”C<ò faUÍ>’Œ ³Vh¤u«-ÎÌct`{jZ“àÓl‡ÝYeÜéöz''·Ä!$ø]Þƒ}/²rÅGoŸR?q›hŸÁ’¥¿ã—;€S°§” ~‹Vò¶²œ‰Æ}à,ìYe:º­ù—ÝûCkARÜ=t^úìñQAÜ Ö A% À»NÀ–?ˆ«»uªF[‚ôiàyØç#Ñ4ýbðìk&Gƒpø!|‘ð:ìëÊÚÝ3*‘®78ÄÙÛ»ýœbƒ’’›°o&߃ ÷·8Ä“4�ÃH�åûS»õölÒ"læ�d·a;�ÓÓ¸2‰nƒñ/pv+^ÿ]Q� Âó°¥k‡Ÿ¯â ÆMxö…äåCx‘Crºcsé�ÿV�®Pçâ˜Eq.Ü!Žr9â–óL¡”Á O˜·ÕªÖ7;¢ÌjØ¡ JóUË_®VkxQc^G,\[r3ilöpòÝHnV(ÂÞì¥oW ËçÐ÷Ô¤Ôâ¥è¯è+ºiIôPúÁ‘ðìK¿œ~&Ѻ |ûaüýLrw8 [®ß¦$&rÿˆC<Š4öº½A"P!·ô#"•4Œ“5”ñhåOܲ wû€‡`«·§Â² ÷‡9”Ÿ÷ä?= ÒG4Ó¡‹£kUŒ[Y¯êÖŠ‘®”5h…ðìsÊL{^£"ôë>[s{ÞÞ´�¨¬¹^uØ1‹Š²>èM‹.¾y!Áj8{<–ÑÙŽé¢f¢,ÇX^€-– ýå^àUØêñ±sš½Zªrm€Î©U-*H�NßÂ~«Ìtbˆ†k=»fX9› fQߤ˜D±d;Z¶d­–I·º;µ÷ä=Ý‚óåâFÙ2@lç`Ïý¢Ë1½|ûA$e€~ñðìg꣸ ö:Ñx\„­=¹á XÏ®šÆº¡yC„Œ±ª¯›î¸EËTÿOîÿh¡}ÅøR5+nm¸~«un3©7ﺇE9÷z`Ù[†â÷(«5} „û 侉C<’E½Y•ͶsˆG1U¦ë…Uæ¶ÌQ市½îHÓŸñô#¼®¤ìªéÐÎF-_ªˆ¾7é-ÏÙâXžó²jSÌÐ¥ú…N¡(¢¾u©«†Xc¶T©xÑêͲ1âÍ~ék†ûFýÍRUô•.â5_Â~©üJ÷ké¿N§�knýªéVN+WÜÑa0|u[4ú»i}Æf6ÝqÜ–Ïn‹‡À›ð>ìûÉ—7. a±g»³P§Ma€§≨–<¼œ3ìlÅänëÚQ+PB]VI4úÆöMqê C”š8T«?é¿=BmV7 T‚‹î Tt%"mkvÁ–š—c‘¬Ð%=âIº ò»ŸRlGáz4]cp=)�Ž`PNM•툒ÂØʤæiµ“ÛP ²á–bÔÖÜG7û.ïºÊêKD:êOdáñ.r×<ûˆr¦œª-ÝÑ*ºiÞ´»Q©”* =; ¼ ûrò%j PºD…z¥#² ZË`«ð5UÏj @î›8”o•h\G (Ÿ»6Ћe#kæÍ¬.±Ó�†�­@õú¢jŠ�Sj o"³LIÆ·àúV¤4†—øù:c£\1Ü–ÒÞ`yQ•/zÃ=Aº·A‘�kDÔJµ.μ˜y¼¤í²ü³ÁÎWâ3¼ûN„­ÕºQÉ4p{ 8 {R½ áÂ…§Ï‰Å]à#Ø�”Ù¥A3uh‚0€(­;Ð a–:™fnÔ/k*ë¶cŒ BFƒ#Ú¶Éà�áááï¾»úý÷¢½!ÊÜfà]Øwãï M"¹ïÁ–Ú¤¦VI‘û)ñ¨ «Xµª�Œ/U½ ±�à.Rän,Âï2�“â‰[$䮨;…•Ü÷rˆGuŒ—÷ÖnjvV/èÂÑR®ÐD8Æ“^=ÈlýDf©®ä•Ò9èG»…Ù<Bµ0ÿi5_X>(<Ø{„Ñ->Ý;—׉LÃ9á/a5 ñhå0¡Õ0än0ºÕ0ûhNF"C;Xm#ODÒôjZ&Gº€Ý°¥ö)ˆçÈVßjp„I¶y[¶�`Å!Ý-§yý·†3 n3àŽ€í¼ð†m¢×¼[j|°ë†ífÓµtáÍÚDêp öR„Y·ËʃSe ³Àç°ŸËÞñË�oaK-iWñ$ðìwÊ*nnoÈÿ·À÷°ß«7� Àd®pE÷È×¹‡jM`èI'ƒ¯¦E«:¢rØ ;�ªŽÜµOÂV¯êöinW"Oz€§aËç–'_½}ñB*W·`KŸH"–+}ÀaØr)þÓÓš^1¼¥?NÅðÎß´)« ›Â…š˜]ÎÀžI~|öØÏêªEª#è±·’å¤J_…›­YHˆP-ºª”:Oá:Àä&ºƒåºß¨zVKrßÄ!ž¤iÌ!Të>œø¹t6B´,ý‡x“åÑY�&ŒhQ‘aÑ¢VÛ¯”õJÆt›u·Rö6Ö{‹xõ¼·€WÛºtVøEž#1 ¹Á–â‹\¦S”µ{W´Á…Rƨ8‡ïjOæ_kKÓ�^Ìh‹N•§·ï^¹2(ÌøXk&Õ—Àl?6uúÕâÜÐðˆF/"~l*·ŽXíØTE™¾‚D:Ïj¯¦iÃB¶äæ2µ¸ÂÄæA†P­·Àz¶A&f‡®N^qI‹gåk°# ¹›+±¬|ßF“•Îj/üÙ‰Z~bvɦƒ)sF^¯®mlHv /À¾ ^«4ÌÞ¥…·3#Úìô‹ÅÉl^KÂèjñl^‚ï£É摳ڂþ#ÔrzÕØÀÞ¥Ì~ š„!7yHRo�Ù´ÖvH·G+úW*Õî_¨’Èñw J8{<…ÿ¾Œ&ÇGÏzÃý Ç)ž¤¾ê›µÃãœÕJ©ºâ�Øc6Ü×�ô{%…=ªLºw]¯| º.ý¡AÛ(¸o0(ž»@Š�;nD‘`K@P˜ÏGp Œ.îs¦A! hЧÛwàFxö™JÅ2|M©¸~V[¢�•Eƒv=›v‘ºÒÞrD§¤•+Æ:­ÑΕª´;ΰ³zÙ­…©º„Ü]Eê7dõnýVñìÿ| £ß0Ú²llèÅr!Øå³cHEî>EšãÂ#MrßÄ¡ü€—Fš§UéüÈü k€ÒK¶îHðO}òhnÁŸänÑ›ÔD êÈ*Â�Ëê#šÛî¨Q•:¯>Ãüéà ½;Â9în›�!÷oǪΠ£}ЇªÉ?p€í¸™^|wBø„a.óÈlx]#nY¨€°¶ÔTLY¨€{Ê U³Füœ)"pxvt—55”fr$ì‚Ý•‚4É7ð$l¹ÙôݤٖË<.zů¹)æ JÂØ=ñ+4UöÂVï8K(”œž†�@噃* Ó¬<É?0¾Êó0Ý–Q¨­9+_dh@” ½‹=.�¥ÁBïbON JˆÁBïb�K Di°(oS¨�b°Ð»Ø#hs.3k8ÙUAryè‘ðl©vVL›yè‘ð8S¸œRU›ôS'€]°¥ÚY1mæ¡GÂèŽ+×&ýÒI`l¹:b7m¶x›¿$jÎ(r9ÓÆ¢í|5Pç ¹ÂϰWUç ä±Â{_bê\�"W˜êé‡jê$ÿ½@¥†ã§:Ÿ®:J_—ª–hçsª\e‰v>W¡ÊU–rçsYC˜`çsª$L³óIþû�ñu>� µ§óy#뢃xÊ4‘\m²É%¦RÊ4‘2ÍL¶ç£¨RÙC¨ÁÖâW© eF7G ®Rò?< [nj~7•¶{*]ttÇ #\9~†, {aKÕhbý Yž‚-×Ä(J”œöÁ޲ˆ6�ègÈ’°vETX¢ä¨1…úSýF·—hjE¼]ƒ,×’•èd¹–¶D× Ëµd%ºY®¥,Ñ5Èr-V‰ÎeæìCÏÍ[…MA†ˆ’0Á@S¢$L5ÐDz� š e�¥h"ÿ}ÀøM-$ÐwtV« ½"I˜à`¾E¦:˜'ÝÀóE(’0ÍÁ<ùïÆ:˜÷–y,zËõ)ZP¥ÅÌ[P¥ÅRÌ[ÈÂóTIÝ`^x ¹ïçODoO[X ºU"Äó�xé0¥=%¿\Õ�d Ý^2;w.¢äWfþ²ž2¤ÙÊ¢lÞºò´²FÙiày0º^8ƒÊ( öÉ”Ðo5-äB|ÿ|Ák3mÒ7¶ŸºMk§¿íóôÈïÁïÞì¿§ó/gûÛ”ÇÊs]wŒ±u½2–/rFÅË}Û\]»SYÛ¸së«õisí‹c×®ÞÞXÏŽ»ÿ¬XcKc N±<¡/ÍÔÇ2UÓý'ÆïÜÊ^»•ËßÌŽ¹eb¬¨[c['Ž9Q%íÄãÁßÕrÂå¸7ì&á‘óÚSœ¥Ÿ£eê•ÒÆ¦[Ò&&µ\ÉÛ#oäL‡>XÕ®j~<ÿòåÌ«0ñqSØêõ ÙßûÛ¿£ú»4{å¶ÿá�ßoãÎؼ£dÎXnËá5çA$f^ÂLÿí~óÞuü¶É°)x¡×ó‹sï³N Jï_�úµnwVJ&§ýþI-£m§ñ1>[¥¾£à6»7oŒ]¾qµFJºÂ!ž@Yÿ¹Úuü¼öº`è¶áë>WÊz'K{GóÒFÀ…íY!^$š@špö¸2qáô#÷W9Ä#AC¾GÝ`Ë8‚Ö YÆ÷ó©5èQÒêín÷�Ã>ž|Æ�ûâù%d ÕÖ�ÇaK¥P¨×ËzÁÔïïCnìc[.iN:gÈ}‡x"Ê™^¾Ô.æÁÖ1AŠû‘+„§aŸŽ0‡Ó)„•�ýÈÂ�ÑXR9Dîû9Ü6Ì¡¦ŸK§áØø² @<ŠÉrzKrG Öˆ¶1B‡tˆïIiFnaõüöQвbª¶¾¦˜  NÝ6|MJ1ý|®á¶á« bZTéxÁ|·ÝÅ*.àÐ+ö‘d™µB#­[mqf£ÛãNÓšŸ6`;ìöÈ*ãNï¢I÷ÿ»)ÅŸ""Äï2ðì{‘•«]~<>µ…¸Ôž¢}8{H–þŽ_îNÁžR.øÁý“Âf¢q8 {V™N‡Î]xœ>îé�/I;`w(‰;Lä‡hyº§ácMA„°'’QwëT�¶éÓÀó°ÏG¢iúÅ.à5Ø×"LŽ1ðCø"áuØ×•µ»gT"]opˆ'²·w{ÄÅ%7($7aßL¾Aîoqˆ'i‡‘Ê÷§vë94„ý0²Ll©µë´žçaÏÇ22ÙávøökåÜ_0Eþß`/(ó8ƒ âm:=ª`X+Žw´ýÉ;3SøZd¹‡!›$i>�õ.”ÒŒbÙÙ éÒáDùªåß_+x¡+ã(Â/ÃMñGÚ&]És3#¶5—¾]5,¯B§:üÝ“¨NôÝ´$*®’óÎÍßãã/¤ VW�`?ˆ¿ w—�a?L^Kä~šC<Š4öêÂW”pûœÃ.ÇR‰øåXÄ£•Ãm'FÅ% r·r9VR² ÷‡9”Ÿžà?=ô G4Ó;~¹Vøuõªn­9á:ù$´Bxö9e¦=Á­ô~Õgkn»èE×EeÝJ=,t}µ¢¬z³‹ožÕ¿ «aà8ìñXúN;¢ºÍDYޱ¼û‚,ã¿Ü ¼ [}ðz.¸J„õBçÔ¨¤N '€oa¿Uf:1D�©Œž]3¬œM³¨oÒˆ¡X²ÝÑCÉZ7,“ttjï!È›;8”¿ò>å2@lç`Ïý¢Ë1½|[º§²ã—¯ŸÁ~¦¬¬`ª®á¹¸»½èsà"ìEe:7èŸìªi¬þ!c¬êëf©2¢eªŽÿ'÷´¶b|©š·ˆ6\fш:wvcØÉŸÊ«,¼û»Cü…¯`eGJñ'rßÄ!É¢Þ¬J‡V(µsˆG1Uî>Ö _/~œ–ªÆ,®v‡™þd„}¡;&ª¦£ÓQ¸ù’ðÕÇýÈJBî¦lŘÜzÛ�ðk¬±,mÄ‹Bëk†Fhøï²YªŠògÂIØ“Êüï×{�vzGtÓ ÁåŠ; ªnãE7­ÏþêMw·‘³…›] ¼ ïþŸ|Ñâ¢'–p¶; uÚƒÌ_n žˆ*ÄÃË9ÃÎVÌrƒë‚%ŠÁ•R‰Fߨ¾?E=aˆR‡jU%ýסˀgu³@%¸èŽ7E×ÑxªØ[*R§–bD£‡C2ClKZµO‹{]„é ƒa ìu:ÿÚa:\6B:îH²R»!E˜wcŒâj8þÓVš+ð.<åÃmd«-B’Šn°æ½) CdÃo‚ SG7™*!½‚\ °C6·  DH¯@±Wð´ø¨˜)§j+1\›¶áM£•J©"Ü_$bG�—a_V&(\1�B"JWÌ¡^w»s1ÃŽ©zVKrßÄ¡|K‰Æ8R ÀxÖ7µ-ÒÕÖy·-�XÂNaÏVVŸSëçM¨¦Ñèá0¥~Þ2+À”d| ®¯EJcx‰Ÿà56ÊÃíp¹£d,ñnóñB‚t¯ƒ"!×牨•jÅ�Å»¬æk°¥ñ:Š áØw"l­\OLî.'a«@ú�ᱸ |û‘2›>нä½›šíöFõ ·&C�"4UÜ`M/‡xœãOܽr×<[j ÃÖ½~§CÖJyQõ— Àk°¥6?„fÍuï€Ð7¤ë¡²n;ÆøÐ Jû`í~.,òØþß/š›7™¿Ìï&Šc³lqËÍ›òMeW¸)!÷÷8Ä£HãD±j;Ôf˜t1�F%ÖÝBªªíüަØ�Óâ‰[(ä® Ø[®öã?_]Hþû�lÇÉÕ²ÍÝ ¨™yQq܆  #_âÑÁ!ž¸ÅAîZ€GXT#ßVšãwhÂDT$Äã(°v¯ºH첞5laÉÞ�0î(‹dË§ŽžçÂMuÕö¿PæÒámw²µ!ŠŒ^žÚˆ×ðD];ìöûü«>‡…“éXrÛÚ¢µ,n;´&žoS AÈmÍ� ‰,ãkÁ´ á2ÆM8F˜D'†hhçöÖ³¥bÆ´¼˜�ðR‡ CÝa-}nbÑB Ç6 y,CöŽ,åÅ£A‹0úÁ„êÊcbu8{"þf„Üõ¯Á–ëÆóŸviYZl3¡2èvE5Eœ®ç`Ï©kª>òº £lÐAx…Íaáðî4t4­¬)þÓ½s½¢GpNøKX1Mª„$2ä0°ƒÕvbF”!M¯¦er¤ Ø »;™9< û¤rŽœá[oÌY4*FaS³ÝöËÎ Ÿ½Aôz€w`KEw={£Ù´G-]øÜ "õ ¸{)¬Ûeuê�)�²áYàsØÏe ïøå‡À·°¥–=‹«xøö;e7 ·7äÿ[à{ØïÕû¤ÿÇÑs¢ç±/sÕú¤¡gV ¾š­éˆÊ1`l©,1��»6`7l© v[ÛS›ƒ“ÀS°OE–'_½}ñB*W�a_L&WN‡`Kiµõ0>M¯Þêp§âu5›¦\ÝNï¦p™&fÃÀ'°Ÿ(3Ž?ñ³º†jSÓtXÜ¿y!yƒ°¥b8b‚™Á»¶ÀnQÎŽá` PÆp%£[vÁS íB°´ªåsüµË‚ÙF4[�°'¢«©¨ËdÜà=ØQ‚·KÆ]NÁžRo£…ãFäÿ>ðìÊ<:í’¿ðžú½þJ}A^³3a'ìÎÈ”2‚é¹KÚìÂüKmÿzuXÓµo¿™Y˜¡izmnQÛEQ�¦ë‰qð l©²� Lד»cÀØ3ÉW̳á�"�£ÁI%ËG•¾ 7[Ü™µ GG“O�oà:ÀäV¶]…·9UÏj @î›8Ä“4�gH�Õº?—NÃFˆ†�‡8Ä£˜,�Îjå¥Åè†E›¡l¿RÖ+ÓmÖÝJÙ;ÅÛé¥ç½]^ÚÖýUÂ/ò‰Iøö#å¹LÇák÷®hƒ ¥ŒQq.ßÕž,֖̿¦½˜Ñ�*ÍßÛw¯\fü, ¹Uܪ]î­öéW‹sCÃ#½‡øùׯ@‹PéükE•ÎÃw€ÑÔ!�gµWÓ´¥5[r3™\ab¯A†P­³À:ž‡Ù¡Á�Á—ó°xN¾9ÂA؃)ää|MNŽžõÆþ Ûtê…¯úfí„@gµRª®xç2™ ç’^QÂQأʤ{×õʧ ~qé ÚFÁ}ƒAñÜ])BîäE‚-Aa>oÁ�0ºÁ¡^,–âÉöÔ5ØZ …â[ø0šBqý¬¶äï·¦Ã3L»HÍ­·FÙN—+4©ç`‚fØY½ì&ª0õ÷ KÈ-cV¤~-<§wiÚÄ3ÿØrëÅ#ê·,:]Švðås¸ûi~ ÷EÉ}‡ò]bꋞV¥óóÃ2JÏ…nݤ䟻óªÄIM”à2²Š�;³B!2ºB¢FUên‚ï™Rÿ$ÛdI648â‘Ü5O³Ú�)q³¾G6F·°@<˜Eþû�LeíçnWñÈe™ olÄí¨€°¶TUL?@„J•mÍñ%CDà8ðìެýr$ì‚-5½¦(Mòß ¹$;"i¶å2� †^ñk.AŠŸ J¶ã–è¸ú ª$ìe;n‰NN¡Dà0ä–è¸ú ª$L³ò$ÿýÀø*ÏÃt3J¡Z´æ¬|I�á�å�(Cm²eHL ?B”?¢\4Ë– U�þˆò# ½i>.�þQþÈ¢ ?‰ ôG�!Î>¦zs^誧\fÖp²«‚ätè‘GÆDz!hmêÐ#áqØÇÓÐ&8ì‚-ÕΊiS‡ ¹sx×&ù? ì�-WGì¦Ío£¡DÍ™�"3È™6mç«�:3Pd¢h–…ª:3�G†)ö¾ÄÔ™�"3Lõ]5u’ÿ^ RÃñS�OW� ¥¯�KUK´ó™…*³,ÑÎgªÌ²”;ŸYd a‚�Ï,TI˜fç“ü÷ãë| jOçóFÖ1Dñ9(3‡äj“M.1•æ ÌR¦™Éö|UšCöj°µøUšƒ2 ÏÀ>“‚JÉÿ ð,쳑«´ÝS颣;�ê$ÈÑ€, {aKÕhb5 KÂS°åšE‰�ÓÀ>ØQÑ5 KÂ~ØQa‰’ÿ ÆJèOIôÝ~\¢©ñZ4Yæ“•h²Ì§-ÑV‰ÎeæìCÏÍ[…MA†+%a‚�¦ˆ’0Õ@è&hZ�(WXº�&òߌ/ÐÔB}G§€ Ò[…" ̯B‘„©æ‰@70ÁÁü*I˜æ`žü÷ãÌ·c•Ç ÿP}AŽ&di²D[x²4YÊ-<8 L°…7!KÂèZxá%$ä~€C<½=­r7èn¢Ïßá¥?SZÒóÙ/X5Ä#YD·ÍÎ�«hù¹eÇ[׳†rÒ*[NdP¶de�²ÓÀó`K™wK€>ñÈ%ÀŽo5-äB|ÿðÚLF›ô�í:ÐßÚéoûü=ò{ð;†7ûïé<ÄËÙþ6¥±rÅ\×cl]¯ŒåK…œQ±ÇrŸÇ6W×îTÖ6îÜúj}Ú\ûâXŵ«·7Ö³ãî?+ÖØÒØ‚S,OèKóõ±…LÕtÿÉñ;·²×nåò7³cn™+êÖØ–ʼn£AFT‰F;ÑxðwµŒp)î¥$:»MM#çµ§¸¥%§e6µJicÓ-h“Z®äí¢5r¦C¬ê W5?žùræU˜ö¸z‰?¦=ÐA�‹ìïý¿íßQû¿]š½rÛÿðÀï·qç?lÞQ0g,·ápÓ¥ž?‰™—0Ó»ßü‡w�ºM…MÁ ½ž_œ{ŸuQzÿêÔ¨u»³bìMƒ»%ºž¨–͇¶“ø‰­:ßQj›ÝR›7 Æ._‰¸N#]áO «ÿ§\Õ:z^{]0tÛðUŸ+e½£æ½s·h£ÐÂÖŒ/M L8 {T™¶pê‘û1ñHÐk²q‰ÔˆXƒí¤t>R3ð(ì£2Ät%iÝv·{€�lK[“d¶�ûcâI?[¨–>ì„-•>¡^,ëS[´¾y±�…Þ “T¾�ûãâ‰(_ÎR®h9ÝÑ3TóxwÐÙ´kˆþ¤å+®dE»¼û‘G„—`_Š0¿Ó)„•£ýÈ#Â�í…Iå¹á�d~5ý\: È�âQL–>®<¹ƒËß–2B»ùÅ·¦4#»CæÆ•%Sµõ•0É�ypì¶AlR’9ègt · b%Ó¢J‡>;Ìá¶{½ÅzÉ>R� ³Vh¤u«-ÎÌct`{ôiZ“àÓl‡ÝYÝÜé]Zìþßc7¥øã„ø]Þƒ}/²rµëqǧ¶—ÚÚC´O‡`ÉÒßñËÀ)ØSÊ?¸ËX8ÐL4îgaÏ*Óép›ñÚí-ása¸³�ÃŽ‚–wƒŽ!T"|üá!È‚pöD2ên�ªÑ– }xöùH4M¿Ø¼ûZ„ÉÑ ~_$¼ûº²v÷ŒJ¤ë ñDöö¦c”Ü �Ü„}3ù¹¿Å!ž¤ip=*ö§ví9ÔÒ?›a3«·Öj=‡}Û{ÃtP¦·ß Æ) %Kâ–“6î®cÄõî1„oç¼ûXò¦Q® Ÿ—a/'SÿvNí /Aþ&ð)ì§‘ÔÄ㬾)yÜǸëaÂK¬¾óõ’�ª}ˆQmÞ»7Û;ddR´B ü,Â.Jkù¸jýD}ôV·í¸¤ÃD ®ÅG+³è–¦s7©ùÇõj_MgÕ;°v†ä“G/ù:J4í:8¼[j,±uÅ]Õ©AÚQNÇÐålƒ^*yG¬ 6ÊâF‘ úÒa`7ìîø ÿOÂ>©œ9â+fè;=À^ؽɰ£ÃÑH Ø!*`to…x[~”C.�"nË÷Íå„ob4<[z"Öxï�š]ˆG,û€°"i­é»�`_ˆ¿Àåž‹uTTêu¿ÞÏ–Šå’Eçô‘d©ÈW …MíKU/P_)§ÒÓ!àw°¿K§èôË‚‡Ñ·£n©²³«FQצ´Áâæ'ÿ_G�z¢QùkØRéÃÀ;°ïÄ/¼N'aO&?R$÷w9Ä“TCÁÍçý2Šcaq5ûéÔ=Ñ– w<¼[ªªo)öM¹„%èö5ØZ$Mýb7p¶t8úç—Xrw8 [.À:^"`€à]Ðܰ�-àÄöðìʬO¬˜t5Ì­;fqD“i6Žû%#8ɳO(•5þ[TÆ.ríÅ(ßL\n'ˆåià$l© [Luä® x¶\Í*ÜN�û{n»�Xñízíƒù«°h¯+C-–)Ö2µqn›`7%Ÿîä~/‡x’¦Ñ…0ž€òÞÑQÑéªû›�-°[dˆ…ºàŸáXÖiý�cTì­e÷o«¥œ-Ãñï�úÃ>Æ­hî°ošn“œ¦S“¹¿Æ!žˆÞ¾uY¯¬xë5Ö’µàµO*ËX) N¢ ˆG²4 ©Ò¡àÐAåW&58#¥¾BI¸ÕåN( ;Ì1®V—;Ëšï¦( å¦\ê¡sëúü ‚{½½ž`Û̽o‰f'q>|û™2÷;ùJ©ˆK‹n?Õï’º?ïX·7èöW·^L#0 � Òç¸å¯ �xvÔ[Óã;ñ†®}�½wÀ<ì|2£±vâ^§.A|¸{1’qýâCà ì•øË*¹›®Â^UÖûo\&Zöˆƒ ´`[‘U¥Ç·Þát�F2÷1l°Š›;#9ìø'åLjpW·ó-ìkÙ‰á[‘NsOÛ±M5©·¸6ÂŽÈÝiK3Šegñ“[w¦okt¼¨Ã¯ŒJ‰.—²…Ó±¤ ïÂNaX:×F“ŽGhIÙmÉ +kPS&ÈJ­ö}Õ "ÿ­ƒn†YûˆM7°v,-Ö·GYýÜL©f‘–3ʆ•³½¡˜›]‰mN¸Ãp–ÃV‹UEÔíŸ�~±8#Ú�Å �Ö �ˆ›³Ða°çDnRhk¦ˆßÒN º€=°{"Ë©››‰Šäì$ò¤xö9å<™AÀ#np’+¶uÑÑVõuïò[oæS|�B|ÏßÁ~—\ýrÎÏvÓ­_Îq}ý²oiá­põr_$ [$Ø%w­Àã°Õ»·Ghʼn×só¤šÓ]Õz3Íö ó%kݨàFyyAëÀ°_D–h»ÍÂB¿çY”má¹oâOÒ4. T›mQ¥sB0á~ÔR€0ÝznˆÃè빦WÓ¢µÜ¾,Ô<¢=ʤA-7Äê›u;aw*çÈŒ\-§™yÍt4cô[8@¯,ôúö·Ê¯r¦Dû_MÛЬ’æTtË.øü”²ÙjE¼f†î ¹ˆAREð\^Š´~CEPÇVê­Ñµée#KkÒü‰JïáR“–ž2LkÇ,¡hb^âð%ì—ÊoÓ·sžU¾%æ6‰á¤ŒÝZâ‹ð¤–RKLî›8L©%¾‚0šÔè  €œ‘×i*Û½ ©Q!ì€ÝY3t´\Ö¦4©¡=ñê^€}!þVi_…Š�°(öZˆÏ’ÿ!à0ìáä¥;e�tïÏùµqí()»Z.—*ŽÛ ×¶èÚþìŸW•ë…ú¦EñÖy¼ ïÖš®Øòë͉]oOv† ôбµÏ±Ng‹k ¢oqÌ Â~¨ü‡¹e4„Üf~EFÍf^f®ìr'DET�Ê®Ù5¹Ù2bÔ< [j»¥XEFî{Xmñœbî´ÕfË$š¢Ò ¼[ªJ�.ÂCT®Ça�'“9�WaK­®UÜ‚Kþ'X}�+lE{ÅÅ×ý õp/l¹%ä¡çWpÅW¶?BÌZ�§aKÏýý|¥�»}À>Øêk�žl kûKqVuÛiZWìMwø‘uÌ,?�öÛãRÕñ·‰�Fè ú�:l=²<°ì¶«Õ°ì�œn°TÇ"侉Cù±È1_}jtn2¿% �jÇŽVQ‹¸ê‡„R·‡_Ø5¢•¼sBtÚ@†Î‘;z}‡[ÈMÂè:vjñ£-"ÚñV§Êüσž�èKÜq°¨ø®´pY½"„jƒÃ-ÞÞÚÂýºIx'ŒoeK'·þºâfºðŠâwxv”GŠí²¢åèÔvöÜ�¹%.rÜwüò!àMV;ù,îF“[ÊâUûY'œ�s‡y¶CG »e½”¡�[+h^Šã0Gá‚F o¿ƒ­~@‚pkÀ­Ž�°�d»³P§M<Ÿpˆ'"y^Îv¶b–뇩îhB)¡¦T�¾±ýæõ„!JMªu6ö«Ò¡Æ™?¶T~î�ÿôÜÅúóUË;46tÛ’pyäZ`~iD ßCx'ü%7|‘R„ÿ£5|Äù(0Ú†�~ñ0Á†�ÜíF×ð�ްÁ#f·�‹°¥wv…ÌIaÕiƒJˆ Ñ4KuHî›8T«šé¿ÝÐ:ë¦BµbhEW(¢Ëœ1¿Š&ì‚Ý%C1˜WK1¢ÑÃ!ž¤3î14`Júy×O"¥1N»²Ür]ñöcé&�€@¼?‚§ÕŽþ-[´DB¸ØÏ€)á8ìñäo®L)ŸÂõÓHit…ç¡ ·oÀ‡° ¶Tá�xÓñéž‡å„ ZTr× ¼ÀŽüÛ¶nL|ö„\^‚})²Œ‘š=!*W�×a_O&O.oÀ–êrnI�³^ˆÏ*mY0†Ÿäº0"xøöûä«›9?¿k˜R­÷ ®ŸEJ#šZï9øþ’j=âÓL°Ö#wÝÀèj½Û”E¶áøÓ8|….[ªT »\²è"Ì­ÅN¸³A¬/€ýCòz˜R±{ ×/#¥q'¤Ø}]5¬Ú‰*ÞBLÿð)o; ®e %÷[¢ô_�2áØw”éwqË_Š“­]<$¬´yšg[Ž®R$wlgÚŠ{ 2„Üù¥ŠÄöŠW¬oàœ0ú‰ýÝn÷hX§•V`«]Ìw�JîöÛa«Ï¸öº΢qY†Nƒ(e ïè7oéœDNu‡`K�XºkÀñ$Î4R½O„X¾fag#ÌÄ]ÂŽ'ü£�Ô®!Þ7€s°çdùïøå1`v.y ØFò­¹ÏsˆG‘Æ9ª‹ó~›ææ­ùÔýå2n“§W„ÛŽ¿txÝTC÷[ ‹iÝjÀ[c{ͯ ¹E"TkØ¢íŸ~àØRS1q“»“À‹°ÕW…ï÷:¿93�-eìöœQYèJŒ®§`O%“7W€÷aßO¾â!÷8Ä£H£}¨^ÈÇ–üö°¶z—ãd•«b¼¹Vg³lˆ³{ FoYý°S¹{h"ÚùŽùkÇ –:cTLÀïðî„-°["¨\$ª}¢Ð lgµû¯~• 1:€=�LÞt5ØšrÞ45¼õz·Œ9„=¨Ìã„^°Kþ“&v½1§p?æ[Hö[¦zB>ÿ©pýû®”s„z=¸ló—*$oT=«%¹oâOÒ4>"”O�Ýæ·�Oçr¦¿„XÛv˜öÏfJëíZ�}°¥–Ö{ ÛUŽhhâI:ÿ–‘g¦¤æïáúûHiŒÐžÙ|©P(}õbÏ�r¼]zE)ë'Ø+.Èø°$ ö=G×1W;¡œ8]>€-Õ9k=ÉÝàCØ•3±E[1,£bfE5E4¦�s°¥b.[è\rJšY,WJëþ¡èºcfÌ‚éljz¶R²m-£g×èPáVÿdDÈmæW$|1Su<Áóbòh.86!ë2!|nß� Hìÿ—#GrnŸÎü=À„Ï›É £;ìb�&˜ ™mˆ'õ8ñiž€-Õi«�È]3° v—r®Ò†päLþtÏÀ>YþȪH\†€J&ñ¼^�}%…¡ùŽÁK®âÈúùèaŠGvF[q¨DˆQ°v·&“»fàIØê·& 7k侇C<‘ sŸé£CŒ9–êÀ€Ü7qˆ'iR ÀhRã’;>ÙÔŠU;˜Ï]7sþ½þYfµ‹p”&Ž„ÜA\Š|¯/†×}|GSMƒ¢$üÐ8üÞ¬hU[_ß’³¶„Ü1Igø*\˜\|é;x3Ó-x& [€)¼ÏH�ã‰/µ-òc!AŠkÌnv1ÕýÊ[ý‰F‡ÒM†�2+À”d\„ëb¤4ö-‰Œ,x'Œf‡ß¯2K£ˆÊ!`;l©ù±¾¹Ûì€Ý¡œ'g·œUT_¥ÛŠOYZøáì e¢O�RpZíà Û¿qO'žÛeñÏ› ÖoVý�xâ-” 9BnGФþÚT f™ù5e€ l¾ ¾°(Ç]¼ÓI-­jáâìú%Ù¤C ´pÔà ‡—aËÅ£5AÑ ¼û~üU¹>€ý@9ûÚ´¯f¡ åJTÔDMT_À–:}kÌ�„DGÝŠÒ©@Ô„-°[”é+•U½lk™MÙË4m�!T[«¦æ3;ך҂ïmC›òÊ¡°Â‰g/pödü 'wÇ�wYí²õ¤ûOäþ‡Ò—¬ËUÓB]5}Zɤõ›auOδUE0�ÏÀV éÆ¹ŽšXΗa/G(æ¸×QïQà#Ø�dùïøå!à÷°¿�¿˜“»Aà°Pxï$m²*–*††öƒúĹ’%ܪ¯OÀ Ø‘%ËnȲ_ X•¥:€$÷MâIšÆ:R ÀäâQkðö5Ý|øŠ´0¥|Ø@ ¨�úÙÓÞ {'›þ¯ÔOD½©—f^ª_ªfÅxEãвž5†ß¼p îàˆ[»˜†SØtûV´¡|xØÛŠ4]uJew¤ã ýZ;«:ÝoÏåEßíWxÂ÷°¥öS‡ºmYvëCÇ^ ŽÚázðìñ©m×$øÈ!Eãn—X»wEËeû›!‡�£““> �hƒ“EÃmA6'Ω6¤ýk$á8ìñ’ïà;Àˆ–•å2ßVÜTò‡ÌnZº‰Ut²zÅvK„o|wuòêøˆö½xÒý4 ÕÖ•ñŸžâù[‹3üC°"ŒîÞtñÌýGð`4™Û™Ë<1ml¦¤O  2„�°;#«“;~3¬T«þæ×¤„½°{“©Uÿ 㟤¬òšC<‘%A�9 Úkzíÿ)RÑ wcÈ}‡ò½)’è¤*�ÿ™ùà£91r`žnÔ¢µŽ�k{þƒÅ¤ö¤&JòAvÀˆ|¤l Ý+Ù‚n‹®tÿ§Ì_&óOA´M–èOòw¸mj°µøGÐÿYAx¶\†ÿTürò?< û¬´<šGë§ËeÃò›rAŠÿ b ì�Ý¿0þÄ@Ø [ªÅÙšCâ“Dàð4ì.uøgP%al©�'Š %ÿýÀØòX#…vnQ¨Ì9­ÿÒüçàØæcÜ2ýç�æ?Gò4K'�¢L‰€<[ªF“é?‡4 a¦ SòxŽÕ®øŽ¾"}\1tŒâ)þ ¨’0ÁŠô_@•„©V¤Dà0ÁŠô_@•„iV¤ä¿kEÊ)T¦"ý#Hó�X¢éAšÄR®H‰€L°"ý#H“0ÍŠ”üŸÆW‘¶æ2OtG_Ú,‹Ö¢ IvÁîŠ_ž IvÃV?ÅMBžDà$°v”­Hyþ1$IØ ;‚VDXžäÿP©ÙUž‡ùxž ÃßB”¿Eæ´±hïrl ÐßB”¿….šeu¡*ÐßB!¿Eîô2Éx�˜@ QþÂØ#- 5�’ÿ>`?l©æsW�¶ä23F¶êˆVŸÿŠ$ŒcSeuþK(’°‹Eµ©RB�D xv7­þK(’°v¥SX�俨T8j˜4ãË+3Lú¨òOX¢Ã¤?�*ÿ„¥_˜¶3k…œèb·?‡(ÿœ%Z}þ9Dùç,åêóÏ‘+®šCbýsˆ’0Íê“ü÷ã«>Û|�ÎûG/Rü ¨ò/X¢Qп€*ÿ‚¥ý (ó/X¢Qп€*ÿ‚¥ý (“p€Å…BüÛj)þªü]² ýTù»´ú;¨òwÉ*ôwPåïRVèï ÊßŪP4òÞ<’¨@ÿ¢$L°‘ÿKˆò/YÊ�ü_¢„ü%K´‘ÿKˆò/Yº�ü_¢€ü%‹³‘?ªz8Á¿ƒ2ÿ(¶±hçR¨ôßA™ÿ©Ó,�:Š*%@�)L¦ˆ©ôßA™„in!ÿƒÀø6€ávrÊÄCÿ Â$< ;ʶ®�Hÿ Âü+”�fÙ²¡*Ò¿B)ù+¦ØØ‰‰ô¯ Ì¿BÙØ#[6EúW($ÅToú‰Þè‚Q,­K-®ÿ÷P%a‚½ÑU¦Ú%§€ öFÿ=TI˜fo”ü÷ãë�Êe +'3ëù IÂ8N$o ÏÿMFw"¹„>‰@°v”Kfèó?@“ÿ�E¹y\\Ÿäÿ4PiÅÌO5ó5}Ê4óÿÂü�,Ñfþ?B˜ÿ‘¥ÜÌ�~`‚Íü„0 5–^3OþÏãkæ;|‘.:ºcÐÁ»‚$ÿº$Lpjþ¯¡Ë¿f)OÍÿ5 É_³D§æÿºük–îÔü_£Œü5‹sjþX.óÖ?�Wz\ÿ7Ðæß°DÏSøhóo˜ây ª:ýd¡Re"¦Ó¿�6 Ï–O«é”üŸž‡}>r�æ•døŸ JÂãÿ ¢$ìa)†G‰@/0Áðè‚( Ó �’ÿ>`¬áѺ@eº¤ÿÊüÏ,Ñðè†2ÿ3K9ƒþ7¼6“Ñ'}£�¾Ñ†_éôÿÖNÛçÿè‘߃ ¨¯Î5é‡x9Ûߦ8V®˜ëî@rl]¯ŒåK…œQ±ÇrŸÇ6W×îTÖ6îÜúj}Ú\ûâXŵ«·7Ö³ãî?+ÖØÒØ‚S,OèKóõ±…LÕtÿÉñ;·²×nåò7³cn¹+êÖ7m2dC•H´‰WË—àÞc¾ú¶žúy^{J¥J§{=2›Z¥´±é³‰Iº/‚.“6r¦C¬êV£U–Í�ç_¾œy¦<®f ;÷3ÈCö÷þßöï¨ÿß.Í^¹íxà÷Û¸ó6ï(–3–Ût˜ÖJ=w3/a¦ÿv¿ùïN´lÓ`SðB¯ççÞg�@’Þ¿:õjÝ\6{}”Z^ÚÎäc|L¶J}GÁmv nÞ¤^~ïD\­‘˜®pˆ'×ÿK®v½v^{]0tÛð¥Ÿ+e½ë—¼;Ô4ÓÒBrC¼`4�7á5Ø×”¹ '!¹¿Î! J³ºïf…°ÛËüŽ-aÛ±^úç³kз¬ß.¶Ãí`7ìîäó†ÜŸäÏ/$o¨æ>ì†-•H¡^,ëS;jv2dRd�tª(e¹ïáOD™sž²¦v�šß–Mwmy9\–&Hy?r‰pöH„9æ˜N!¬8q7ÜðÕuÒ9FîG9Ä#™cM?—NÃ�ódA€x“ep{±ÆEQTÕ�h£££â7#ÏaF¨ïFÝ ´ 2ÂMJ7ýܮᶮ nZTéxQUñÈË8ôêØ}¤Af­ÐHëV[œ™ÇèÀöÐÔ´&Á§ Ø»=²*ºÓ»»jK|B‚ßeà=Ø÷"+W»ÞZu|Jýpö¬2�·5¯NµbùoAR‡|IzØ»CIÜ Öw©4 ïFp8{"u·NÕhK�> <û|$š¦_ì^ƒ-5Þk� Âä‡ðEÂë°åÆwü§{F%Òõ‡x"{û÷,¶r…ä&ì›É÷ Èý-ñ$Mã0R @ùþÔ®=‡]®ìnÄŒ°™Õ[kµžÃ¾mŒúèZóú•Å#ZY÷®Ð.Yc¶qÏp#®w�©ß‰Iø ¸ {9Â"·KýÛ9¥ºç¤Í/¨>…ýT–üŽ_~ûûøëaÂKÀ`ÿ Þ‡Õæ½ãálM¯Âw§~a¥µ|\µ~¢>z+‡Û®Ë¤ÃD ®v)¯dÝ¢;xWõŠžuŒ ®J÷®ônê­Ý¨þäÑËE¾ŽM»ïÁ–Kl�`1FWF5A*G�vG”Ó1tAÑ —JŸ(•eq£H}é0°vt1ˆ…ÿ‡'a«‡,ÅWÔÐwz€!KÜã.`G!†£‘°Cò—\å�Ë£ˆÛò}s9áÆ› ÏÖ‡ˆ5Þ{§æDOÓ!–}ÀØ‘´Öô‹ÝÀ °/Ä_`�rÏÅ:**õº_ïgKÅrÉr;F6I–Z�|µPØÔ¾Tõõ•r*í1~û»tÚ�N¿,x};0ê–*;»jumJ,n~òÿep©çþ‘k(•¿†-‘> ¼ûNüÂëäpödò#Er—C [‹¤© _ìÁ–GÿüKaËÅøOÇëC t+·K;!ZÀ‰í%àØ”YŸX1× K[7*Ý1‹#šL³qÜ/ž€}B©¬ñß 2v‘k/Fùfâ¢p;A,O'aKUØbª#w]À»°å*hþSáv‚ÜßãODoÐkÌ_…%@{]j±L±–©�sÛ»)ùt'÷{9Ä“4�.¤@€ñ”÷ŽŽŠN7pÇg{ßköQœX(¡ þÌe½âÖŽQ±·”Ý¿­–r¶ gÄ#ØUØWãW4·¾Í›¦ÛÃ$§éÔ¤Dî¯qˆ'¢·o]Ö++Þ*ΰe-xí`5YJëLN¢ ˆG²4µªÒ¡àÐAå—'…®žØ±LI¸éåN3 ;9"®¦—;š>ì [IµÜÁZÛíèmYäçöuGË–,G7ÝO©GH„‚[ñxëE³µ—{ê¨J?_)=r£èöWý®©ÛÌçi…ɺáö[ýOé G­”÷Fb ¤Ï‘á�Ë÷0Éqù®#±.om϶ú…‡fÄñ;`v9™¡Ù1zµˆõ,ð=ì÷‘ŒÔè¿ÀþÁ%w“À 슲òx#5ÑRHlàì�È*×ã‹3/f/i—´Ù…ù—Ú=ÛÜoİÁòns£”3‰‰ Üîaõ¢PÖ3©iT4ƒNsOÛqNR}‚>$A€ÑtMîO[šQ,;›ˆ ˜ÜJ4}g ä…"~eTJšûG[8)ûÁ›ð>ìû‘)éÀòº^¨†•÷ qˆ4턳�Ü7q¨Ö­;¤JGcþà9@<’thà:çµê ‚ÌhSj �[à¬0hÛmT9µê8e{rl¬`º]”ÍlÁ­\)˜™ÑReeL¯8¦û{ÌvôÃ¥·9kl”�Šémkøj *Sz¥À7°ßÄöj½µWºÂsµ×W$x/«°«‘�£ûJþÚ•IM/8S¿›áÈ~Q‚êðÏaÿydµLórÞ\©Vªr¸ü ØaC¹ê})Ômðw°§,©íYÔ¾5S$Jôÿ ü¯°ÿk„yb;•’µÒÀñ_ÿOØÿg„ŽÝòU°‰að¿ÁþoÉ·9äþÿÎ!ž¤i "Œ¦¾L�·—²m{\HÏE¸«Â�ÇäíÆØã£"á}o]Ž‚LÎÁ;!·ã1âqn…ÞµàeØR‰%>¼=<Å— }xöiYÚ;~ùpvtû+ŽkÉÝ~àVÛf©(Ú3šiÙíBuJnq¢èŠœ–§¸·pÙ"z£ÀW°_%_'�Ga 0š:‰íÎB�ö÷™ãODÚ:¼œ3ìlÅ䮚Þ1h „º¨’hô�íg¹¨' QjâPmxuP•­à>¾G8{B™èS§¤ÙÕr¹TqjË/l‹‚N<ýÖsÓrt·‰Èz[Smo¬è¬f%8·Xø ¢ÐáSØRÇAyúkS-˜™_S˜ðAEÓH�iåöø Ú\žfkGÕw“ý“‹&5Á¤šæð2«Åp#ª9"ØE4�òAøöãøër7|û‰r¶¹ÃÄB�nîpË›¨ª‰Ê ð lõéªR“«á ì”MØ»E™Î±²QYÕË6�¸*¹é1ȪbÂ$}fç@Ú?À{C›ò £°Â‰g/pv[ÔÉÝqà]VÛªžt'ŠÜßãPz‹º\]ý!Œ®®>MuõÖýtÒg›<áð l¹AkA"b9\†�Щ–‘‰ˆ÷(ðìG²üwüòð{ØßÇ_ÌÉÝ ðØ?( ¼wÒíIjÅRÅ?ÿ„ji·cœ+Y­ñúÜ€-µÓ®A0¤ñýbàI4ÅQ$¹oâOÒ4f‘&”ºËj†4óá)Ò>À”òá¤@€jA©Ã?—NÃÞÉóÇî≨7õ‡f^ª_ªfÅxEƒÑ²ž5†ß¼p îàˆ[»˜†SØtûVK og†µ ´�_·t«¤Óðbç0ìMÌLW�RÙ9C¿ÖÎjƆNôí¹¼hba/ìèN\صò_@bFW¥‰+‡üŸæOdIdNƒ~½öb¤¢îž‘û&å{‰$ÑIU:´w©•Ãh¶³ ø¨…ßí=©‰’|‹ì"€=yã˜ú�Y<鈶ÉýÉàÅ·Í@ ¶dಂ0ºÕâ§Þ“ÿAàYØg¥åÑÔ@m¹Ìt¹lXR»¾…{`÷Ä/Œo!B¥3~¶æ�ø$ 8 Nþ‰®Þo¨Ðo¡JÂ>Ø})(”ü÷`ËW`�Ú¹E¡2G‚½‡4߃c›�qËô=¤ùÉÓ,�<Š2%ð l©ML¦ï!MÂA؃)È”üŸžƒ}.ŽŠôqÅÐ1”¤øª$L°"ýU¦Z‘�SÀ+ÒP%aš)ùïÆZ‘r •©H?BšY¢éGHó#K¹"%0ÁŠô#¤I˜fEJþÏã«H[s™'º£/m–EkÑï IÂ.Ø]ñËó;H’�;Á;yy�“ÀØQ¶" äù$IØ ;‚VDXžÁ™µ„J�È®ò<ÌÇó.³ú½–'aGyôs�.C”ËÐE³¬.Tº …,#wz™d¼NL Ëå2ÛrPkâ%ÿ}À~ØRÍç®mÉef6ŒlÕ­>¿gõëEOÀ–ºÁDL�ßC‘„]°¥jmUu�nàIØ Ìþ=IØ;‚Ò)¬Nòß T*œ?5Lš¡­Ô¶Ì0éV¿‰6ÁaÒPå,åaÒȇI?@•„i“È?p€Å5Lj÷ΟŸÙÈe‰�IŸXý~â^ØÑ͆5”è'ÈòTÑÌ"9\\¢Ÿ ÍOLñr1‰~‚,?±-w'.ÑO�&¡[‹£‰w%:gåK‚ô~„" lâ„" Smâ‰@70Á&þG(’0Í&žü÷ãkâ[ëxòÓ!I�%:€×!I�¥<€×!K�%:€×!I�¥;€×!KÂøðj÷Ëd Ë ¶É–!1�f Ë ÛrÇIò%}@¥A¬˜F3Ð%ál¹¾ŸšFÉ¿T ÿT�iΦUvóVA´ÍB”„ ™²%aªA&"Ð L0È”…( Ó 2‘ÿ>`¬A¦9ûZ%H/E&ØÍA‘„©ö@‰@70ÁhŠ$L³Jþ{�ñõ@Ýêó…i;³¦Qȉ.v3 Jƒ%Z}¥ÁR®> 䊡šCb5 JÂ4«Oòߌ¯úló:ïŸ+!H1UæY¢QЉ@°v”s½ ôùš$Œð®ia}’ÿÓ@¥©ÞŸêˆ.ÅÒºÔºú5¨r�%Ú]ƒ*×XÊÑ5Hd�%Ú]ƒ*×XºQòߌ¯#êÖ ‹†•“™ð,@“„ Ö h’0Õ”ô¬A Ðd�¥[ƒ’ÿÓÀøjÐ#œ>ef<‹f ÛX´•H‘!Ì"§Y:qEJú�Jµˆ˜H‹&¡[KA¤äÿ pö`ä"íðEºèèŽA ’´ KÂgå-èÒb)ÏÊ[($KtVÞ‚.-–…2b±8gå�å2oýS†¥‡ô%h³Ä=J¡m–˜âQ ª:-!ƒ•*1�– M³°å†Òj:%ÿç€çaŸ�\§‡ùC¥–!JÂ#£eˆ’°‡¥%½À#£eˆ’0ÍÈ(ùïÆ­ T¦KúÊüÂ�Œ~�2¿°”#£D`¨±Ä"£_ LÂè"£Â§;‘ûAñDôöt&«¡ìRˆç%¼tˆ'鍸e«†x$KéöÒÙ~À• G÷ûÞ±[6äÙÊ¢ìét%jÑ�ž÷5ÕÀI8“l’ÏÈ–Ðo5-äB|ÿ8xm&£OúF}£ ¿Òéÿ­�þ¶ÏÿÑ#¿?P_�kÒñr¶¿Me¬\1×Ý�äØº^Ë— 9£b�å>�m®®Ý©¬mܹõÕú´¹öűŠkWoo¬gÇÝV¬±¥±§XžÐ—æ?êc ™ªéþ‡ãwne¯ÝÊåofÇÜr1VÔ­±í`ŽyQ%&íÄäÁßÕòÂe¹÷˜Ÿ÷[�þ<¯=¥¢¥Ó¥%™M­RÚØtËÚÄ$݃á]9›3ú`U·­²l~<ÿòåÌ«0ùqÕSØáŸAF²¿÷ÿ¶G#ðviöÊmÿÃ¿ßÆ�ÿ°yGÙœ±ÜöôVêYt�˜y 3ý·ûÍxwrb››‚z=¿8÷>ëºôþÕ©ÿPëvg¥òº6ûPËèCÛi|Œ�ÆV±ï(ºÍnÑÍ›ÔÏoø•ˆ+6RÒñÊúËÕ¯ãçµ×C· _÷¹RÖ»XÊ»Žn8\ØžâE¢ ¤ Ça�+N?r•C<4äçËÞÍ,< ¡¶—ù�ZÂc°�ÉPkЯ¬ß˜¶ÃíàqØÇ“Ïr‚C<¿„Œ¡Úú ð8l© õz`Y/˜zØñ²û�û�{¤“D)gÈ}‡x"ÊÍÏMÇÝaùJ©è]S\'Èv?2ˆð"ì‹f–c:…°bÄ]Ôã]£²‡m¹79©Ì"÷Ãâ‘̬¦ŸK§á`ù² @<ŠÉ2°¥8ã²+ªßF´ÑÑQñC¾›‘a8ÜŒm ¥+‹¦jë+a¢ Zôƒ,tH›”húY]ÃmCZAÑ´¨Òñ¨â‘×pè¸ûH5‚ÌZ¡‘Ö­¶83�Ñ�í±¨iM‚O°v{dUs§wÿÖ–€„¿ËÀ{°ïEV®v½yëø”úÙÛDûp¶T�úËÀ)ØSÊ¿—¥ Gž‰Æ}à,ìYe::]“îT+–?È$uÈ—¤‡°;”ÄÝ`QpyJ£Hðn‡€°'’QwëT�¶éÓÀó°ÏG¢iúÅ.à5Ø×"LŽqñCø"áuØ×ÕÛÐQ‰t½Á!žÈÞ¾Á]‘­\!¹ ûfò=r‹CºŸ½~÷òˆVÖ½»ÀK–ÄåžmÜ3\LjëÝcê÷z>cõS=Ÿ±-÷zÆYÿvN©î/ió ª‡Oa?•%¿ã—ÇYý8Éq¶åRϸêaÂK¬~Fà%¶åROÙ>Ĩ6ïgkzžžð«/¡ü䣤–�«ÖOÔGoå�$&ÚXp½¨°‹…%³èÝ#¼ªWô¬cTpç»wáÆ©] ÿäÑËE¾ŽM»ïÁ–Kl�L1FWF5A*G�vG”Ó1tÑ —JŸ(•eq£H}é0°vwü…ÿ‡'aŸTÎñ%4ô�`Èšö¸ ØQˆáh¤ì�üEÝG9äò(â¶|ß\N¸ñ&FƒÀó°¥Ç!b�÷Þ©9Ñ“sˆepö@$­5ýb7ðì ñØ£Üs±ŽŠJ½î×ûÙR±\²ÜŽ‘M’¥V _-6µ/U½@}¥œJ;@L‡€ßÁþ.�v Ó/ Fߌº¥ÊήE]›Ò‹›ŸüAê¹äŠFå¯aKA¤ïÀ¾¿ð:9œ„=™üH‘ÜßåOR òÛÃ_DCqŒÃ#,®†bÿâ›Â-ýÐYàEØÑÍèíÚRì›r KÐíj°µHš úÅnàlépôÏ/±äî(p¶\<€ÿt¼>DÀA·r»´¢œØ^~€ýA™õ‰sݰ´u£’ѳ8¢É4Ü* Åyý°26@eì"×^ŒòÍÄEáv‚Xžþÿs÷'ðq$çy0ÞÄ’ $@$€"x$$AK�ÏÅ.Oä^Ü]5fz€^ÎtÏv÷Ä®äC¾o'ñ™øˆç>윎oEv,É—|IÖ-ù�ä8–£øKœÄþ}ýv?=h3XÖ1Ýüÿõsûy3œzºê©ë­ª·€c°…l>ÕQrmÀg`‹5ÐñO¹û Jþ\ ñ(zûÍAÿ`¾U)š—•!çËä뙚bÉÖÁ®K>ßã[�žZ~’¦Ñ†ˆ°6姆†x—b¡²ƒïÕ‡ÈO¬"¡CáeËEÝñÛ ÏpÜ•eÿoóvÖá D°ïn«&¸÷ŽOÑí(7ÂØ#ÉK‰’?C<ŠÞ¾ñ�îÌ›6+í$kÀkï––±TìFˆ�`mÚ$K‡œC›c(¾7©Ê¡êø%î~7»$hë5ÁQ_¿‹Aoý$¥Ò€�.ã,£NÔÂØ=ÊÊhãÌÔ½«"sØ[h<Ì_0 xöé‚i`¦µ`ºæl~iˆ·•£ÀÓ°…V}+¦úôƒ=_ª”Ðe>$¥æŒ’¯‹¡\s¶Y– Ì›cˆG2WúÊûsßð¢eæ>šø °Lp§­Èîž.”¡Ü~ÙõÍñîܞâvxö]…5}ÏCÓ¸Ä9râ{ 8{B”÷š_NÁžª}ÛGÉõ§aOKK»®êFáõ2vxö=i;×ìyçn‰»Qƒc¾Å¤[Ä$¡š†Y[Ÿ…ç\É Ïþô%ÿKžŽ`F¯Åý2‡ð„×a m4““Âa$¡)œ�XSÚlqÞ°‚e0Ú‡diè¯b9ÿk:Ëämÿ[¼ôcCÔ`µtƒ&¸Zº‚~;·è*–)ŸUà.â~"Œy»$ÉíŽç-Åä@ó²;F„‘J~oÐSfŽq9ŠÄ c§^UùÖÙ\Õ—Ž!Œ¶7Õ~dby˜��Ifš¸‹^Av+2ñ>œ„=©dºH¿8 ÌÂÎ&#ï~ Û�–÷Ff;¼m1ÈMئ4“}f.ìØÂá�Œü1�5èúýžÎ?FˆÅ(©[*©1 ’ŽPí’'Å–ÊT™ƒõ"µ!Ù”å2€’¯‹¡ø|KŠÆ0r ÂÚ¬z¶Nd³&•‡žg«¯›é1-ì3 »`w ÏþöÉfÑ`1Ä“tùÅæ,iªyI�(¥1@g�rv>o/Ò¿¬:Ì‹ºã1;œ"r2>–„â6¥¼"[5ܺÀZ÷¦”Ì ðìKÒÅØŶãUѸ |öóÒtŽöùSr³à[ý99í_Ö=sÖÌ›ÞÓ3ŽíºlVÏ<4¬¬Ëí4> !Ʀ ’„Ï–¼@òq¹û£Aæ�Œ? ÌÁ›¸L�AÂØ”]°4É6!£ZئG˜ð�©ÓÈBuÛt70Î\8½ ñ(j–È%e;zÕ 4ª6H§Ã"p—¶æ>áZ5H”\=°M[sŸ°ðæé¾¬‘Óýñô˜Hù´÷Á>WÜ4}mâÆ4÷.âÒ€-Ô•ñ—M/pö tÙð¯ÔQúCÀaØÃÉ5gÂr 0ņãÌ*TÛplËéfþu3÷zÁtÝ ä$ŸD‰U°Â½µ’(%W¬poDòÍé†-Þç*ÙãtU†ð8l•[5×)š>àˆ&QE²õ ôOOŠ)RÅQ}×÷hX‚å5†”¦n”|] ñ$Mc 9¡šÜ8åÏ ]#6s,”ÜÈi½`fé(Šœ9É.‡Û¥ö èÆÕIçà9$¡š|j’{ñe‰ª_|ß( W ì–Ú·t”ÜF "º(ذ³‘–ê ¦Ø[lñPYïCTº�û` �§ùËd7°v¯t™4SsÁs™Äe?ðìcêFp’)buxöÕd ê8ðìkÉ·­”üõ⑤qpÑô•’±-×ïŠf[ù%VnÝÂ=/ü½Ñù°ðŒín‘¤ÚwËöé:ò�1·Tô‰záêTÔyr³½†„êbé^�´g™™)åug€ § S”djäDsýž?èþ÷ZÞÈy¬dyv)3/°•è"è_D Ù ZCä¤:�¤#Lmp ‰ªÈÎH‰U#p7l¡­*|í%·Ø»#•Á1èvÁZOSèÉ".€}°8öNÉuûa÷§< .G€§a‹…Y¬Åh€X�Þ€}#™‚:¼ ûfòM,%+†x$irK™Œaø]«Y}Ó+w¯t9,ýÁ>”|–]AÒ&·ßã˜VîŠÓt³Pòu1Ä“4�kÈ�k³ß£i:¾2ÉI‘ÆÖ�À6Mv›ÿnÙ#1Ä“tÁ=‹ÂŠ0%O"éI¥4vN ± wÊ‹2|džÓd�EÕ¢¿$V�À>Ø l(¹V`?lù�Í¡ O²ûÂbÑÐi_{Ð_åýþ)˜Ys,^eÇ#ÀÛ°oKsÝ*•þyȈ0nZBR£#ckò ?÷u¹Ü»’‰àQà8ìq…êZgWòöpWò2yêÀ>Øjî] _Ü <û|í«%×¼û‚´ŒùãRú�°…v�­œhRä.N&7Pu7ÂÞ¨¼µ¢]¥Q²+vœž†­.ÈÁºõhGX�bì¸ïîƒ-ìH_óË[€g`Ÿ©}E¢ä6ÏÂ>+-`áè$Dc x ö%eã 1w q™Þ„-4æ/™ËÀ[°å§¿uÜS[Jÿ6ðì;ÒeáÓý7Cqx ¶|Þž›YqÜ4£[á)¿Yƒ•èàVüŒêªî7ˆ±Ž/I'=Q¹�¤#T3QÙ8ÿÓüR'TÓÿ­HUä,"QÙl†Ý\û†ƒ’ÛÜ{›t™ì/¯>‘|ù4¢îâì€Ë=xºƒïŽÀ‘&zݯfѪYÔ@øÍƼ¬¬Ù‹á±®%ËÓýjš Ö¥Üà$³ß¬˜.ür¹÷yß…æåN…+Ùç=¥….�Þç=�˜ÖTn×<Ä&stn¿|Ær4[ÒaxS÷nÁé…-vœ >�iT‹°/Ö¾¡ä€°å'6M,X‹Ï}8¯¤‰Ê%`l]@v¨JRòeÃÝzÍ@Ö„ °¤éì,μ^tÉ‘…\à$vdÕûèö­=ÞÞûˆ�5‘[áij8;�xÈ”\+ð­9é%.†Âñ�Åêû¡º†z/CD„[±sâ�ôïÇpl¹³ µ ]@,¯ÀNè 5%¡ ˆ÷ðl¡ xÅ_î¾ ûÕÚWsJ®øìפÞ9æ#YÁvÂ`ûÔJû£â¬mq÷jÄëuà#Ø�”eËz;ã§Âj ½ ©œ»q7€”|] ñ$MãEä@„É-�G³…—Ò-‡—�÷¦T/#"”[:o~\:UG't#Ò–âQ4šºiæXŸc¼Y2ãÍD‹zÆèë�š¾{︽~ëb^~É[Ѿïþþ úÏDɳ‹þ\Çë{›ígÆ#½PÌîdŽ÷Ýà}@÷[BT¤ù†~{è¹óöb•¤7#á¿T;µ­›/Ç�$�cþ�˜�dËWa£DÇÆBìë`½cbè,�õV=NU•ö«È2Âc°�¥�}¯!íÕ´]{V.0ù™éç–阮@N½V„Qxk¡3‘+²a�c?Íw�!ƒÍž¨ŒÔÁJWš‘{VºG¤΂լj†Êò0V¥ ù«miG¨¦Ú¶dg¯˜.k(£ø3ÈÂØ-ÊzÛmïé—ê/é÷·;aw&Ó_æ�¹”•C¿´7†x”eAT8UFbôÚsJEË=@¥äëb(>N&‰ŽÉÒ™×Bç~„âŽþø§=á}EW.M^.¯½Fñ…Ü1ÆKÒDqöÀÖÕöx-ÓÌäu—w£ÔZ¸—è m%úŽî›5ÉÖl¦0Ù*¾‘7P„û`‹¹ÖâŸòô{�ûaï–G]y4eg'ŠEÃÊŠlüy1vÀ0B „�Zùþ"Ùâ_†"{€{a«k÷«*ô!TIØ[ìø”œB)ýn`lñ¬šB[V(tÂq¢¡ÀcóÌCšypl ±Ö2ÍCšydO½pöHÊ”0à>ØÂûó_¦yH“°vo 2¥ô÷À>P‹†ôrpM‘HCZ€* lH P%aª )ØL°!-@•„i6¤”~7°¦ iL¡" ©iZZ¢ ©iZZÊ )`ÀR Ò$L³!¥ô÷k×�6fg¯èž>³TämEmH’° v[íåiC’„± s“—'Ø ì€­²©"O’$ì„­ á–'¥¿(Õ‰¬+Ï­q'Ã"DYDá4ij?Th¢,Bõ¢º�h )¢t:µDB1!Ê¢¶| š|(F~�Rú]ÀnØBÝçºm ×¼‘)y¼Íç›P$a-âìVQç›P$a›¦*ή€:‰@;p7ì²¼ EvÀVP;¹ÕIéw¥*ç;M“Äš9P¥£%:Mr JGKyšä hœ&9P%ašÓ$J¿Ø£ÕjšÔœ�½nxWeŒ¢@ ²t¡•&Q­ðIÔ…,]¨¢^S±& QÒt¡•½¢Zᓨ YºÚŠ[j—¨ i2ج]¼/ÑI+gsÒó H»xŠ$Lµ‹'íÀ»xŠ$L³‹§ô;�µëâuÞ-UÃäVãW‚$KZ¢ø$YÒRžÀ— Ë’–è¾I–´t'ð%È’°vømËòñ�.@— Zm®¨¢ÑèrASy�€€F‰@Pj˧Ñè’°¶ØØON£”>J¹€ßÉÉ4éNzö¶•çmD!JÂ�L‹%aªN&"Ð LÐÉ´Q¦éd¢ô»€5u2Mº÷éFiNz� HÂG � HÂTG D ˜àôI˜æ”ÒïÖnº5Œ vÍ4òYÞÍnKå’–hó¹Q.i)7ŸK(•%ÙâèDI˜fóIéwk×|6…½†Õà¤øTù––¨ô-¨ò--e/è[Pæ[Z¢^з Ê·´t½ oA™„=Z­¼ PèTxõ7'Å·¡Ê·“UèÛPåÛi+ôm¨òídú6TùvÊ }ª|»¦ Ý*úóÝ%a‚�ü»!Êwk)wòïF y·–h'ÿnˆòÝZº�ü»QAÞ­Õ²“ß!vâ=Pæ{@±IS»–RE¥ï�2߃ܩÎI•� Ó$SøTú(“0Í ”~/°v@¶ÐYS]èøÇWA“„í°…üæ|úü*h’p7l¡Æ[VŸD Ø [åZo}~4I¨îÔ#¿>)ý½@©¥Þuõ¹=¦OýWC˜_ †MšÚ±X‘~5„ùÕÈœzáÌ‘)èJ ÆøDúÕ&!ƒÍR)¥¿Ø »·�è´aeEÖ<¿š$L°ýh’0ÕF”tlD¿š$L³¥ô÷kÚˆ–õ)Òˆ~-„ùµZ¢�è×B˜_«¥Üˆ�n`‚�è×B˜„LK¯¥ô÷k׈n E:íéžA!•9I¾º$Lpaþ½Ðå{µ”æß‹Jò^-Ñ…ù÷B—ïÕÒ]˜/êÈ{µZ.ÌïÌÎÞ ã, Ïê¿Úü:-Ñh _m~�&MAV§_‡"”jLøtúuÐ&á~Øb³i9�Rú€aT®Ó­ñP\œ ¿¢$LÐ9úõ%aªÎQ"Ð LÐ9úõ%ašÎQJ¿ XSçè²@E†¤ße~ƒ–¨sô ÌoÐRvŽ� ÓsŽ~”I¨Î9Êà‰’ï�!EoO�i º¥¦BÊóxéoâI:¾1¬[eÄ#XKW×ζÊ1®89~“FÞú&ȳQS9ÒÙìKÔ¢C:URÞdšª‰w!}*I„ûD+KÅoÕMe+¤ýï›ñÚšˆ>éMô�&üJKø·fúÛÆðG·üH@]Ë\“~ˆ—·úmìá¢c.øÉáÝÎÙù¬á¸ÃÙ7†—æžu>:{zÑz}éᛞUxxüÌ£…Ì1ÿsÖðÌð”W(Žè3·_Ö‡§fK¦ÿGŽ�=�9q:›Í ûõb¸ [Ã+tEQ"ÍDã—ËáS|вèè*5 dש^é^xC¨c?Zò+ÚÈÝ\º�5=ú`^·ªí²¬¿|ûæÍ«·*i/Ö6÷”#D¥¨ýEø·Mkz€{3×q×ÞÓ_YÅ=þaýšŠyÕò;Óš[.ŸÍÄ,Ș‰Ol2ÿòþžï]¥Âºè…îÜžž|1ãE¢ þÓ[þ¡ÆÕ‰j^ÐeÇY¹˜·¬&ñríH¬ÔùšZ[ï×ÚœICüª_Qܦ‘Žcˆ'ÒÕψ5­Ç²;yCw�PõY;ܪÜáMwüN ?9¸¢,økDX‡}\š9wRò#1Ä#@Ct%âþÕ©Kˆ=¥…ÃY°wˆ«2¢\¾-nM²€-ÚŠî&Éb¡äwÆOúÅB õf` l¡ü©˜êÓô¼©WŠ,»e±Q«xcRRåBÉ·Æ�¢rB¨ ¦³7©l˜ßÜèlÎ\0¬ò=y±›69¹oBqž‚}JaÑy¦—¯T¥bwi£°G“/:Jþt ñ]ÝãÒ©:e~E!Élé�UmÜúåFKlhhˆ?àw=ÊŒ°v¯BÝ”\}®’n¢þ}³Vqn›”n6‡¥]ÆUs[NÝ4ÈÒ ü©1Ä#.c­RK´‘¤Ãɬi\ió3 =½Ú)5Áø4›a7+k«[‚ÛÈVx&øžƒ}NY½Z÷²Öqù8ÜD{°vŸ(ý5¿¼ 8{\ºâ7àÞXn4Ñ8¼ûš4�mº‹ØÃ 7'©-¡$Ü{›”¸« £Ûqª¹„×#Ø�-4±àWwãx™¶é½Àƒ°*Ñ4ýbðì ³£Šƒ| ¾HxöIù>tH _OÅ�²·¯rsfc¬’¤8ò¤äOÇP|ä)Ec+r BññÔz#‡WpÇ a=pl¡­"­^�eæuGÏx†ƒ[¨i&åé¦Eæôݼš&lž€­²FWÑtä'< [A�æá© ×h9ÍÈ�k£é§üy'±˜‚CO`ˆŠÔ|(¼û¥è º`øŠv}Óuý�„mÑõ½þßæí¬+Ây+ð8l!—$Ÿ¢c×`¤°AuAJI‰’?C<ŠÞ¾ñ�îÌ^äJÞ­¼öviKeÁvÔ�妺M²tÈí»9†â’*gŠ—=%ÕF·U�"ÔÚ×wÂòGò�çZ ÂVØbþÇø§ ˜‰¸¼%D4v»`wIÓaºÅ¦ObºÆ¼yÝc¦å·w¦ç²œc'˘¿¸Òú»¤Žš#G@x:]€Û9à$ìÉd¦It×2o!±> < û¬’ùýâ>às°Ÿ“VVݯÂ)ýç�7`ß�WøÌ¼á×9ÊwæËøŠŸ5X‰ºpº=˜Wᱦ@‘«+=;{Íð2óÜâ6¼ûz2JßBÄÁ[€õ ð4l¡¹[Å_> |ö³µïAZQ™'a 58+rx ;�GM°|aglÇ~òÖ5¢ôð5دIS¿me ¶d—ؼ¾`°œ?ásçýzVriâ§£°‚þÐ`nÉ1èU2yCw˜éñ¾Â.T>ÂqØò®ËM"mB’'Œ-Á)nZÑ&\¦ {î–�ž�}&™–aGØ2ÄØ poöÂîUÒ>Ð/nž…-Ü·>~ûÐÃ1Øc)t¼”þ3Às°Õ­Ž<ý`AÏ—*½ÿT•v-Õ©%_C¹©X§,:yÑC<’¹²‘†AœL:P&„±M!OĤ�8m¶ÃnW¦ÙªU–’Û¤-iÞ¤­8"#X8'áFb¶•_ò;ÆÙÍ¿t+ËÜ%+3ïØ–]rýOŒpÏŠëOÔ ^YuÄžË(ÉüèôÝØ@ãwå>­åÍ3†5gZÆc“´­Ï'ÍI8�:X¯Ý¢"õ=eÙ¼ýž„-ä®"9£Pœ¯’ìðly÷oSy©[K¼Z"*£ÀK°/ISêÇ`– ²œí„îMZ†?ˆôõåOÚ�qÒ�ó×úa÷+ž5ˆÎÖˆÖEà³°UÎNÖ“m›ªíA¡ŽÃ{WüåcÀIØ*�4UÚuJîð9Øò>�&´ëÔ–óV2¢ò<ðØ/HSÚé×+¨T…’KÞ�|ž·:ÅÎ(Jî]¯:m“›èì…vÏÃ>ŸL¥j—™åa„-´Í¾â/w/À¾PûªEɵ/¾(­ãn¶ 9t3°µcäg· àk°åÝ!-Q‡õaÜ3³.T/ÂØ-Ò¼N]ó;WÓò êÿÍ…À:�tçíR>Ëô|Áö=¿¨/¹¬èÿ’á0NêÝ Kx ¶Ø°e½Vbëò�ÜM1» |öËÉ4[Æ…¯Ê!¶—€7` �ã+þò9à+°_©}û@É�À~ ­q~/¥ÿ*ð5ØòmÀÆ{.÷xµÕ…Pͼ»â®ÚÕ¡¡¸+ñ;<[åV³õœ‰ã’�­ˆóà>Øû”T#úÅ-ÀQ­¼#®ÖÕˆ’ÛŒ�½�•/³¹[~bpø ìg”ËwǪۜ„Ôû2ð Øo$£ÞíãrWQåg�/ÀšTüåKÀ‡°&#ÞsÀ<ì¼´x÷ùƒ×3ôÀwàžc ¡!\ˆâÞƒAô Àï€ýÒ4[uòõ±@؉ÁÝy±°†¨n³ ·ïz’ŽP�G_[Ÿ…<í^ÿ¹C<ŠT¿õAÖp3Ž»Uv�ß2* N%”iô�Õ�ä3†(ÕÅ�`S¾C– 0cˆGÖ%23oº‘Þ·rü]ÞAd:¡—ÈŠoM_½qõòLµFµÚ ‘éöÀî©}[Nɵ™VÞ(#YH½Á*ƒi¸ÁÉcÓvÁ`³zæ¡? ôKOçvb¿}ÀK°/Ió|Ö-‹¶ãë >-Ë,–òa4ƒè¼yÇ.ÍÍû¸,;Ò\Æ.ýoΚyÓã~›CPá³°…œÈ+ÞfÌ1t×¶\?¿ŸµýÞÓ\†´ Zw ÚÝo[s´2ee쒣ϕýô¼üƒ3ál±µðw4®ˆ4Ê=hìC]"†=œÜ Q&L*QnVå+1h¤_¬ƒ}¬ö MdBx¶ÐúÙ¼?¨‹kkoù¬ ÿf+œÇ pöLòƒ³~äQ„jgÏÒÆ‚pØoεk/lV,»†ã7Á¢6ýýÊ¥›ÓËëÙ&ÿQÑ#xBu ÞÅ¢íºæ¬ß¢Í…!šÈ¡¼ “3´`—üÂgv.x§!ö¼á³ 7|K–7¸›½ØÂvàߢä[ÜòK"ëøtœA·hdÌœ™c.u˜á_ƒþ’eæmÛ ¶àå #»äK^p¶e>*3ÞwŠ�ÒnÁ¾%ýNÏÊqtË%g´Ï®ÀЦ‘ñ«¤ž§w˜`6�Ô ß­üEZߊtMò¾Ï Þ�ð9ØòkƒÏgò¦ßš°ÁA6ëç8Åý²ü×q]Ý1óåÝ£`ÓÞ Z Ÿ¢ÉïbýÞxÚ0ü¹mÖ\0³%=ÏûBCx Âça?/ýB ÐÖaÆIg`7(<Ëm3Æ ÷Âî4¿k£ä�]°å{ì]^+èè O7óü}1ëž…}VYÆl~^U&�$‘cšÊnŒ»7¥äëb(75¦]I½í3QÛÿ•ߨåòÜÃãÐ!ƒÍDÈ$wËæÑØCÚ´8KGJs93CnÞ:FÔÆ€÷aß—ƒ—¬¼á†û?uË#¯Žž!'O|…¹ÖY1Xæw­åƒ¼úrøó-Ÿ%üDÇ3¢WsŒ’kp�»c«=’+?ñOOÏD]ŸÖ›%Ó1‚MØðºØ—®?‰È‡ç”ùÛÀg@8­a¬¸ ”ˆ HÄî_†�Ð&WñØ€Dö ð&l¡ábÅ_>|v{\cÛà‚=®g´tö¸Rú¯_ÓTíqm w4ÝšÃ[{ΡÆª÷üî^0ç,ÃóŒ¾Þì¬9¨gt+cd{¹�ÀçðEÂð×^4”\°¶O+G•,¬ÖÀí«û�vþ!v"pˈõc¶`¹�–u™Ð ´­1”‹Ó¬U-§*AÕÎC¹„rÑV$ÇvŽŸ�a#l± Rï0»}ç%•õ(‡-´j/6»½­›è¶{a÷*é’èwG`�Ô¾u¡ä¶Ohåh¹’ªí "º8äP,Ç{ Â.!˜�cAð+Þ*N,Ojåþ:°…úíÊGwECŠ]ÐÂø „m°Û”•ÝÖ@ÌÓ'cáÂÖ¤¾ÅЊ� 9ª ôw;`w$×þ^Ä«ªkûØí`îžÏ/ °YÓŠ¦=±H "±‚.ÆpP+ï0PÜD‹úʉÕeàs°…ö:ð·Î‚¾rb:ŒÙ fúµ“Àça«\7¨Ò0SrCÀ°åuˆøÊ‰ÁMàØwj1š÷•µ‡ÀEØ‹É�&D}åD÷Uà<ìye¢}ø¶ÊŃuD{¸{)…®ˆÒ ø6ì·¥yœ œI¦¹’¨ÇÌn¼°[@„s—ózƘ¯ä¥?Ö�c~=Iú›ÝRfž–Ç9Ù\Âèf uA�7\¨F§Ê}hDc[ ñ(“ö‚áÌVI¶¸ööTÚcb°Ø [ì�W¥ò¨;p\ @ö÷ÂV¹9n�ÙìÒTEB>8À²FÑŸ[ ¬•›—q΄»9"ŠÝÀ˜�ÔÈørX̪ïX12.ñ{).ǰ ¶Ð¬iýºä}Η Ö¤•³¹Ämxö…dMãqæ¼÷‡a+Y\Fu‹¦]šÄ@ûñG”\;p¶Ð^˜y<¸æH°ë9¥ŒG1ií\luŽœ¼µž¨^Z°-iÊÁlÓ.yí ¤®ÏXχxY^ ëL€ 6K®mºŠ$ Söš^�aí¼¦ÂñáˆÖ>`?ìþdš"ÑøpWQQ »aw+i…èw�À>RûVˆ’Û< [,eüÓj…æ /ÜìjyþÔ"Öì `W5HØ*À½wˆø_…ýª4ïvìÏuŒ.uò§Àü;n¯…µ$@uþË;×¢@`oŽ0£©[°>‰Ó]F-[ÿëxÂ;°ïȺ(HDl3wfÇÎÈ•/ï�¦Õî2÷Œbt±Bp<8Ë ~î™EÊiSd3ö$ÆÎyJ²½|›¦í9ÛYÔ�,Õ-RIpj18³mdV„Íè_ EÇïkí’ÔEî}ìÀX|8.ù"ûÍÜ ¦–¾`ÎÑš MTèåøs«»—qƒßS5ƒð4ì„ö6n_É]€y;ð l57Ò/îž��ÀþFJn ð,ly¯Ýžà ¨‘Ï—#]ö»§¬mñ·ýDl 8[þzkgûã›b+;cD×Ppœ)ÂØuŠ[¼Û2™ümÑŽÁ:ƒÁßÖmiÊ}Àa­‘KA+G¿Ø |¶PüZ¾VŽ’Û <[lSõŠìXg&ãÀ‹°/*k3­g8ccYŠ./¤Ø—�s°ç’Qì–�xÀ[€õMà °Õî¥_¼œ‡-¼£ˆO´@¶)-Zî”ü1Ä#;y¢‹6­ðžÊù`Fë†q9B˜ño ˜«D€ƒ°…ö�VLµñ�a• À¬R©�#½ ž¤K�’¯‹!EY°ù‚ŸTHù8^ú^ºp/¡pÈѸ�ˆP<7Ö eÔtM7óT— ~SÂ{û55–�À6Øm"j­²9F4:bˆ'é‚{…aJ2~ I¿¤”ÆèD4a �—º\ØMžPÓuKá}ÂáÎË ‚‘îOål—Êó2øŽÂšÒ®Y 5­=ofcg�¹Wo_!Bu ¤]á|Ì‹Çí¤ðƒºÿÿ­ANŠ@‹° ¶Øf¼Š{oMT‘Tsß‘Àƒ°…W DÉuÁ>$]T ´0-2!&‡�ð…fG+èœ�WÉ`Aõrr—,O-¡—Å…šÀû¯BN„çaŸ—~‡G”¢‚®9ÍCžqŠ“f±¾Yú pEˆÜ7ùÈÊy#*Fƒ(Wë@«Ö "3¼ûBíë%wxQ+¨‘,Ä-~aÍ‘,ûyUED&€ÏÖ~Z�1œd^‡:ëa×+SJƒY(Y³<x|±Ÿf`›¦ú\cU±Pr›�í°åû»Ö²X‚½F«D  v�ÂVw±Ð:%Qž‚­r}b�2ŽÂ–0ñŸô¡ôO£øNBkýrcßw…ÅYÆ”†à:’ÖÓ¥1‹¤geipÏè_@j™t3€’¯‹aJ3ú,r ÂÚÌè['²Y3< Rnby'ö~Læ »4‰H×ÃfÙŒ#,†x’.¿Ê,”Ô<‡¤ç”Ò ˜Ö9;Ÿ·ƒi|¤œ`NQ€ëE“NÆó`I»‡@Q?-Kž8�^€�Àœ’^„}QÁÌ4¸ ÃÌðjŠhL'aOJÓ9Úç�éÌBѱƒèn±‹”˜žql×-_Å=a0!#ÂØu’„Ó¥$ø¸Ø¯\šdÑ…Aˆþ1^²o€ aìJ%Aý7É6 t¿1†xéhU¥_eËS9@¨nËÓÆ™ ùUˆ']@>,ß[`·Ô¾5¢äê�;a‹Ý”ÿt ëË9½”÷ÆD §Ø »[ÝÌîÖ½7DŠæ °¶Ðáþ¢éökqgWÎì¸\Jÿð(lñ¹¶ÆÛhÂb 0ÅF£° Õ6â®!âÓÜ{WíÅIÉÕÛ` y¤TµD¤¸ö¾tÛ ¢Ò< [¨âðM/p¶Ø˜;þ)»Aé‡`){ýÍA{a¾U)†%öNqºFÉ×ÅOÒ4lä@„jrãˆ?k\b…’ëÑ)Cè›Y#ìÈ× dDÓHnOb �À:R¼‚ï8Å¥A}ït|Dß]ÉãÆ¯ßBÀÓa%WŸã?àó&hF›{Æ“/yIG˜œûÏ@jnº5ÐE­‹0¥è!"¬Ñ†žÂæ¤XÒÂÙ a›&»¡GúF2¢ÑCYûá÷[� ¡ºû?ød)ýQàiØò§´ND»FqXËY}RËÿ[Ö .V‰^âo#ÓÞÖTê ö*ÙØe#¦‹mŠÜ¹ûn#ì�Ý“|Ïð$¡šžab2ôÃGÅãpÃ0›~ûË좟™±R/úÝ†ÄÆÊ¯u ØÒ¯q~ygª?RµË£±ÿM÷pMÞñ5»´ú�xßá«Á›ð<ìóÒïÐFÛã‚]}îr�âVë×€alyoÍAZ8´ŒÅ|˜wF6®¿j í2üZÐ#<[h¿è ª”�‡œôÞ J„°Å¦G¤«zœˆÁVçr©ÚåQr�ÀaØÃ)ty”þ1àqØÇ“o”¿ºˆPM£¼q†ùýë‘:áFØ•©uS°ÒÅ«QⲸ ö¶Úk”’ÛÜ{»t¡ /ïeÔi…[Þ§¼z;ó€ß* •ßàØê§ M˜‚ÝP@Ô^fag“™{4†s�K ˆì à=Ø÷”L:è¯ ØF2ê¾ÌÁÎI«»9îån�‰ËЃí%ßC¨ø2&ç-!µo”MY.(ùºâIšÆ7!"Tã}jõxy…”åÄÎ|³z@ {`÷(ë7Å{‰Ï!àìÆw”Öß5”ûN�Ò9<[h«¹_5Ñx&†x’®_ß‚:aJ­Í·"éoM—Æ·!éoSJCd þíH�Pý\¼-!>[€;a íüâkK(¹MÀVØ­Òsby^vVeM×óGâ%Ó ¢ÏÞ"ÅbêÍšŽße÷ò*Šï^‡}]šø(9&z‹ŽQ$—D/›¸3é2;—3œðþã‚n--ß{‘uÌ.Á=ûèŽpö¨4÷Íw0×ádó�`@¨þ›íåÁÆ™ÈA.¢µ Ø »»öƒ’köÀsÄ?=¸ì�_Η0H ��Â�μr"Š xöiª×>€‚;ú,©2°Swm ÖRa}fn9F4Õ’àr˜ nôs×�ï‚¿K[+\òe¶RO�½l¼õã»Á‚p+lñûs•le#*;�m°…È|u‚’k¶Ã–?€z‚ Ýr£ B±uŽy»”ϲ̼mû�í¢ÿ±A±,|ÉñŠŠï>û9iâ— úCà (l—üì–k”ç8Q/1À¨O¡:âycA·¼~F¡õ]‘ªþ7 ?BuñÒ/Ù>• c£P9Óñ_H÷üz_ôX.p8° ¿–g(a®”�–pðÞ÷ø›àNx ö%é÷‡b°îaZL÷µåÒž±P]ninÎp=wEø‚ŒíP[Æû  ´ å6•©H~�®­nƒ½­ömÃ÷ ¾§üT8t—#pw$Ddpl±˜’ñO÷]}¤S\÷pbùÂŒYc^_0mÇå>’ô½È+Â}°÷ ˨Iv¢ö}ZØÉE˜ðeñß� Twº #8:u+¸q¾?†Ý°…Æ¢µ*­ƒÀ“°ØbCÉõOÁ–ßb³Õo¿=à îÑãU11NÀÛÀ€CXr•êP‘"L¸Rý *Ò*­Tgýñ@8Eˆn^‹ 2Ã.ÖÈŽ-Ç9ŠbAòæÞÆð<ìóÉåÞßFŽým¥¹w`EîUÎ:ÞŒúÛ1ì‡Ý/œQͲªÿ;Pz„ «þ‡PV?¤´Ü¸ªýÐ*Ä£¨Ë<ÝJdš€-Zb§[)¹z ºÓ­Çƒ¨Ah²1èO[�)æZÔ—æ—Ê. ÌÈx…Lt[�W`ËûWÆf�ŒN±Òííˆ cÃ!|œµ!n`Å”8˜8òòÿa¨Ÿp ¶PøòŠÜµ\›¸1Í=lùH�°¶�[�O�?‚¬ Ü {·t±¶³>šï“Ýåé'÷i="Õ†=œ\ãù£ÈÂÏ]…ODãIdš€ 6ž?ŠšA¨®ñdQùf˜ÆJ"‹ Ä®x¶ºàŽòm ñ>[ÈÈ_x'�ÏÖ«È=$£äoÄ�¢·_?ªúß ËSû»À”V¢)ùºâI$ ~¯ýcéfÁ�áµ#α¾åïáÍ Ÿ@Ïß‹¡z�| F¼OÁN °%%×…=*]j2Nbrx ö%á‚j�­U_ §¸&<ÝýqÔ¤WZ«?ž“‡7¯~<†°ÅãÐm–-º€âŠ0á¢û‡(®¨´èö1פ•аüøáþa Á>”\.ý#äÌ?RšKçXoRNÏ÷"‡úÜRfžg¸†ç…ÇÕ2¶•3ç˜] Ž_÷�… ¢ÜÇêþQ '`Ë«kYã`œ¼þ1r“°¶Ð„¦6«D«Ø;�x_”ÜN`?l1ojüSEî"uxöÅ„F±ÿù'Zª£XJ¾.† �bÿ)ÞœðÉ^ø§1”_Ø"[nÿL ;Øîlÿ9ÊêŸ+-7nÏÖ?_…O„g‹È4[´Ä<[”\=P�gëp|Y`Q7ƒ¾<Ø´±\©h;£@ÁµÇ`Ë9Ó•Ÿ$jÓÀ×a¿®°kr�È^Þ�}G”ôš_ž¾ ö»’Qõ3@¶ž|7IÉÏÆORÍí¿Å`ŠÍí¿X…ODsKdš€ 6·”\=P]sÛYu!�W±Ä«8{0¡±í?ƒDÿ¥–êØ–’¯‹¡ðØV þ>^û'ÒÍ‚ŸÀkG˜d|^û'ÓÍ‚ŸÄkG(>Ñ¢ñ¯� çFÅT×;±ýÍHí_§[ÿyaJåðo�ŠçµúÝ�K§j÷õoµð”b„xõ©7ÍësŒ7K¦cÜòÇënQÏ}½SÓwoøC�Þ¿Ÿ1 /¿§R0cž(yvÑ1-¯ïm¶ßï�½ړ9ÞwûwxÂa¿¨Ló ²¶å¹óöb•¤7_‚ýRíÔ¶n¼C<’<Žel‹�dÙÙËa|²>”èØXˆ}ý¬w¬`lgi¬·ªc¬*í�,#<ûX Ù÷SH;B5m×�ìì ŽŸK3úlÞèóóÒϬ‚—Ñׯ¡ÁŸeÿôÀ> MuÜŸ_½|'PÈwúê�«—gØvmêöM�f/<{uê*Ë,åýú|R Ø¼ Ça�K¿ÃÖìì5ÃËÌ÷‰dëÏ€¡Ü¹Áø§-+c’‰ûY�!l�-4ï�¬"?‡´#TSEFö3:ÄE¤ÈwvŽ"ß• 7t©ÒjI0]+Ÿ,ªêP­JüçA–pöˆ4ñ�k+ 7³_Bôª ævõŒ–Àª®wUeó‹`@(wküÓ>ömÈ…^~ºïEÂ>ØB M+# ³Po®Ï*oº^ßÉüUö?‚a+lù0 Õ/‘¨JäýHœ°¶üXXª�ý%Ð |¢ÚÙ_Â4ÛÙÿ„´#TÓΡ�-øÙcÒ>¿±uW·¶‘›¿�ý%‚=”â ä‚À äàM¨nP² ™JA ƒeôF??·‚á.ػҭÈ�)­Èk²ëŒHvý*øüê““]¿¿¦4»´{¿2„i¶{¿�´#TÓîùtÅt]›Zþ úM�ùMé ªµø=ýR¾�k¡¿ƒ°vg2¾�#3÷À–?³Ï¯Jo ñ(Ë‚¨pªxÕèµK©h¹��”|] ñJtF–ÎokaÔÇñHæJÓ5Ûa¥bzžû†»ßAá6Án’ªÄ÷‹‡C•é(÷f¢7<ûœ2)¯»`ûø*òÔ;�ý°ûE©¯ùåVà8l¡�Y•L©²òJÉ5ÏÃ>/­âMA€!�¼½¼ [,�ÐzêÝ’�½® éö0;—ŒnÇË´Hß¾[Èw_ñ—ŸÎÁžKF±W€ó°çåýÜÁ|(}øì7’ï7ÔxÕtÎ=·ƒð[W.M^^¾ ÷Çûý/Éß1ÂØ=Ê«öÎt3yÝ­¶¦Ñ�haÏùm%úŽU|M²õ@›Õ¾*}EA¸ö>ùªÄ} �Òï_XuUäÑ”��(ýÎ?X©â¤øQˆ�°vGí…ñQˆ�°¶ÐÄge ñßCö÷ÂV7ý¨ªÐ�B•„]°»RP(¥ß ì�-Þ€UShË …N8N4#}lž¿iþ>86ij#ÓV‘éïCš¿�ì©ÎI™Ü[¨Eã“éïCš„½°{S�)¥¿x¶Ø²ù;4¤—CÇ’?'Å�A•„ 6¤ƒ* SmH‰À`‚ éÇ JÂ4RJ¿XÓ†4¦P‘†ôã�æÇµDÒ�Cš×RnH‰&Ø�~Ò$L³!¥ô÷k×�6fg¯èž>³TämE?I¶Án«½�~¢ü$tQ/ª Y�~ ù$J§S\6âè'!ÊOB„…!'PJ¿ Ø [¨û\W  ¢NÑOA‘„»` -�ó©óSP$al¡V[V�D ¸¶ÊÚYE�Ÿ‚" ;`+¨�Üê¤ô;�R•ó�¦IW™®çŠL“> U~ZKtšôi¨òÓZÊÓ¤O£hœ&}ª$LsšDéw{´ZM“š³³× ï꣌Q\>îôØ?Y~ZiÕ ŸD?Y~ª¨×TlÈ�èg ÍÏ@+{EµÂ'ÑÏ@–Ÿ�,6h¢]«œD?i2ج]¼/ÑI+gsÒû,I˜`ÿY(’0Õ.ž´ìâ? E¦ÙÅSú�ÀÚuñ��:ƒM»œü>I~NKtÿ9HòsZÊøÏA–ŸÓ�À’üœ–îþs�%aí&ðÛ–å)âýèò@°I´ñiô Ë?@ÞÔ ç�¤F‰@Pj˧Ñ?€. {`‹�ýä4Jé3 ” ø�œL“go[yÞFô!JÂ�LQ¦êd"�À�LQ¦éd¢ô»€5u2Mº÷õ¼É>ê� HÂG E¦:%íÀG E¦9¥ô;�µ�úÍç Óõ®™F>Ë»Ùí�!Ê?Öm>ÿ¢üc-åæó�Q*,[B|ýcˆ’0Íæ“ÒïÖ®ùl z{–.AâUèç¡ÊÏk‰zA?U~^KÙ úy(óóZ¢^ÐÏC•Ÿ×Òõ‚~Ê$ìÑjå…BÃÓ…¼ ýTù…dú¨ò i+ô På’Uè Ê/¤¬Ð/@•_¨©BÑÉëH¼ý"DI˜`'ÿEˆò‹ZÊ�üQC¾¨%ÚÉ¢ü¢–n'ÿET�/jµìäwdgï–lϘÌ–gæLÃá¤ù'P柀b“¦v-¥ŠJÿÊüäN½pîHª”ô™&±˜Â§Ò?�2 Ó<Bé÷kwdKv–M"Ëñÿš$l‡­ò>È*úüÏÐ$ánØò÷A è“t;a«\ë­¢Ïÿ Mª;|ϯOJ/Pj©w]}n�éSÄ_ÿ§柂a“¦v,VE¤ aþ)2§^8s$EJº�Rƒ1>‘þ)„IÈ`³DJéïöÂî­ÅliÊ(Ø B‡?þ TI˜àlé¿@•„©Î–ˆÀ`‚³¥ÿU¦9[¢ô»�Rô�šÑr(-‘fôÏ Ì?ÓmFÿ Âü3-åfôÏP2&[J|"ý3“�ié5£”þ>`íšÑmrqH¾]&¸4ÿ%èòKZÊKó_B%ù’–èÒü— Ë/ié.Í uäKZ-—æwfgïYoJÍëÿÚüs-Ñx mþ¹&OAV§Ž"”jLøtúçÐ&á~Øbói9�Rú€aT®Ó­ñäœ ÿ+DI˜ {ô¿B”„©ºG‰@'0A÷è…( Ót�Rú]ÀšºG—*2$ý2”ùe-Q÷è—¡Ì/k)»G‰@�i‰¹G¿ eªs�r‡x¢ä{cˆ'iÿ 9¡šHS,Œ4•Õ=�9]¼ ç%BMý˜ý…&;�X¯F?-t¡àÿ£…U—°ES»Z•jLÉÕÕÝ®&P�‰@+pl•;âªTãÿ2 lƒÝ–BgCé·¥6Ľct–åhÉœÿ;TI˜ ƒî¿C•„©:èˆÀ`‚ºÿU¦é £ô»�=Z­tõ1ÎIî@�„;a 5c|ÚüÐ#a+l÷\ðk“ì¶ÁjÆø´ù? GÂvØ Ž qk“Òß ìÐ$N ½Ó\2ЦÈ(ý/!Ê¿Ô�Kþ%Dù—ZÊsI"Ð Lp.ù—%ašsIJ¿ XÓ¹ä²@/Ï—"I<6Íÿ eþO-ѹäÿ„2ÿ§–ò\’ô™–Ø\òB™„inµ¡ô{�µÛj#~0öA’„mZbcÿ$I˜êÁX"°(ÕÍñÉóA’„iŒ¥ô÷ŸØƒ±ÿºüßZ¢«oÿºüßZÊ«oD  ˜àêÛÿ†. {`‹ÍNä4Jé3`íVßš³³Ïêîe›neñ ^WÓ_A–„ gù+Èò¯´”ƒ³üêÈ_i‰gù+Èò¯´tƒ³üªÈ_iµ Î"»Óæ¯!Ì¿ÖÝió׿_k)ï´ùk¨ä¯µDwÚü5„ùךÊ�6Üë ”ü¾âQôö›¸†¡ç]»BÊ¿�—þ�jV2¸3àÿ «VñVÒÕ•³­òåœÿ�Þlõ ÑF¥ÝìKÔ¢ècURÞLQ¥ÿÊŒPX¥ ©½Êº'Éÿ‹’ù¿È«FѼâ.¥ÿ‹’ù¿ZªK¤ô#½1Ä#–k¾U7•­�fô¿¯àµ5M ¡o4Ñ7šð+-áßšéoÃÝþð#u-sMú!^Þê·) sA÷ŒáÝÎÙù¬á¸ÃÙ7†—æžu>:{zÑz}éᛞUxxüÌ£…Ì1ÿsÖðÌð”W(Žè3·_Ö‡§fK¦ÿGŽ�=�9q:›Í û­×pA·†cCŒ¡¨JD¢™H\ør¹|‚OQ]¥¥�ƒì:Õ*Ÿb–Í.1Ç~´äW³‘1–µ™e{ÌÈš}0¯W]Э¿|ûæÍ«·*)/ÖÙ#DeHëÑô·Mkzé{3×Ï„>ý•UÜãÖ¯©–W-¿ƒ7­¹åÒÙLÌ‚Œ™øÄ&ó/ïwÿÌ* ÖE/tçöôä‹/’dðŸÞò5®NÌI®˜ƒ‘d¹¬·¬fòr혬”úšŠ[ïWÜœI[̪~Eq³FbŒ!žH\?'ÖºŽdwò†î¡ô³v¦D[�õ`œ`ZljxääàÚá¯u N8 {Tš>w.Rò§cˆG€†Ô$èþÕ©KØ=¥…3Â6mM¼žÇgWe`é…J“€§P„–õ’*J~w ñÑ/îÎÀž‘ÖXݯÖ)ý{Àû°ïËk}fÞðke>s �e|íϬD=ú¢éÍój½únU¦õêš�ŸÌávÁ À»°ï&£ùíÄ^âÜQžƒ-ì½[óˇ�S°§jß«´¢ZNÃjVdó.��<šyùÏØŽ?.å­uDi8{^šÚøm+c°%»Äæõƒåü™ ;ï׸’K3Br€ô‡sKŽA¯’¡SæÌôx_aª!á8lyŸæ&‘Ö¡ ÉÆè·­hbÇò¹›bxxö™dš‡aó T€8·{µòèHAû@¿¸xöÙÚ·m1ƒ=–BLé?<[ݲÉÓô|©Òûï@U‰ö�¤4G£äëb(7Gë–¥CÓžæâ¤Cb*.GÎ{…<'3š5c ¦˜õ\DãóžWtdž‡ófÎÈ,ùÝÄ�3˜7g‡lgnXw<Óÿ‹;ìzúœáÑÛì7ýÙL°­ê«UÙ¡C¯´ x¶Ð°é±^­³üJƒqÎCîœïÀì’ïø·ºìàBowŒéyoüð+Wcd_=,@õð{`�²V¦þAΜóGUž~/ìïUغÏ_ª˜ì6à÷Áþ>iI­9Þ·²Pjô�ÿ%ì©°L\ϱ­¹* ÿ ð'`ÿ„„ýú•w«‰Þí'aÿdò}%ÿ¯bˆ'i±#Ú {à�4ùæd»–A‹m[”BÇ¿¥À3IĶhå“äÑÂv­Çˆ”Ü&`ì.é:‰ f[ù%&6[ ' ne™»deæýJk—\ÿ#ÜZé2oÞàÕ1îÞ…-Ô¥®\uœ¾{û<ý¹£Oky�§aÍ™–Á=ú�Åz ¦4ÎÖÍ“´#ÞÏ9N6]`@mÓSç¡ʲyg]Ddpì uoŠóU’m¶Àn‘.•¦²ãD·–x…BT¢£S=°{¤)õÅýÉ�cž|(–adIä%_Û‹Ú õöÃî—RR•ðÞJâv8{J¡¸ÖqG4�K¸*‰ï(ðìK¢¼×üò1à4l•kUºJîp¶üj@º™êZx«Q¹ÔaëÒ”vú5É ªW¡äÒº@>Ï[±zP™¢6k`Š+Ö69G_´Cx¶ðÂ_Íj—ñòa„=¨¤jÑ/v/À¾PûªEɵ/¾(­ãn¶ 9t³³5fäg«· àk°_“æØumQoÆ=6c¨^„-°åG§®ùݬiy�Ì…`Yp éÎÛ¥|–éù‚í7z~Q_rYÑÿ%ÃaœÔ÷�.á)ØbÛ¹Ök%v¬Š@ÅÝN`Ù7À,ìl2íÄöq¹ðYDùð.lá¥Î5¿|hÀ6jßRPr£À윴Úù×(ý9à¦È+P%ÔuÙ;À]�ˆZð(ì£ÉT ­ã1â´w÷Âvg¬ùå-Àص¯<”Ü&à l¡qÃJÑ2›»å'CÀã°…6}®+Ú­Ë�§�fŸÞ‡}?ÍnéIlÏŸ…ý¬2Éž¾û…d$;|ö‹Ò’Ýçm\ÏÐß:‡„pû÷nD¢÷p ö’4ͺËôð¾Ží¹æî¥ö‡•"Àh%YÈ1%çB?€¤#TãB×Ög!O›6~LÆ�"Éo}�5ÜŒc—q®Y㦌:$“iô�Õ1�ä3†(ÕÅ�`ë½Y–mUkŒ!Y/È̼éFk¾•ãïåú�é„j¼ +¾5}õÆÕË3ÕZÔj‹4D¦Ø£•§ûµnÈ)¹V ÓÊ»D% ©7Xç0 7X¥blÚ.lVÏ<ôÇ|~ééÜlâ·xI+Ï $y>ë–ŠEÛñÂÆ¼ [f±”£E/àÍ;vinÞÇeÙ‘æ2v¡èsÖÌ›÷ÛÄœÚÁx`ƒ&8Xñ6cŽ¡»¶åúùý¬½èw�Î@à%¤#Aºc°pI›ÖƬŒ]rô¹²“ž—ÿp&ƒ-¶ýë<+nˆå,Æ&5Ú0ìád‹ÛÇå®·%ÊMÀ �a%FŒô‹õÀc°�Õ¾¡9 ™‡-6µˆº?¨‹kkoùÜ)ÿþb"8œ�-´žP1ÕÍþðÂÓÍ|¥ƒ_Q<•(ˆ^J› )ùºÊ #è_WªÜý3X�E4ÊåíÅ @ŸµW†^à=wB3èFàìúíݲ¹I4NÅ0¥³±CÐS„)ikI+¥q*ºQœ_sÁ  Z�ã™í÷„ ¦±Át’„ÆKýèÓd½âñOŸ ×Í ìW!þv.6øÐ=œÄcž>ë·nhìhj­¨&Üí\¬Öžƒý\òŠAÒªQÄÐMZñs2¶Qqø9L|ýì,A$TÑ¢“ÿ-NÎ'ÀóÄÊŠ¥xøÓÞ°)¶8BÔ&�÷`ßKfèC¾Ý2qÚϯÁ¾¦dØsÕ–ð>l•ŽÃ*ÃJnøl!ÿœ´o—¼|ö+ÊE»9,{!½¾ |ûQ2z­ºÊ–˜Î-Ø–2©Î—` y-ù¥úøì·¤¥Ês¥ÿ6ðݰß-Í£ÅïLЬ@(ÊV,ÀŠäŠ~M—ʼnÞqàì‰ä&½2ËâD¹8[¨_­øËÀK°/Õ¾JQr;�—a_N¡JQúW€Wa_•æ±gqÞÌÌG;Ofé\l.gfL¿‚ñŒ ¨ãûé% ž/YyÃu—�õêËQrÌ·üF»±£m«‹ºå…KO%—Ug¼ ÏÃ>/ý§g¢¬OëÍ’éÁÐÛbÁ� ן!äÃSËü�Ûi>½ÒVܸI„$Rw€/Ã~9™fM<„àiÔ5›°o*iÐNCd„¯ÀÍñ5h”ÜàØä4îºFé¿ | ökÒ<¦ ¿�È»6oí9ƒCØ»AªöÄ¿µ{Áœ³ Ï3úz³³æ ž]ЭŒ‘í­V…ª®1�Á ÃV¼¹ªh(¹F`ŸV+YX­�§P÷íüC,ÒpˈõÏÁ:>”ÛAY_ÈY­|€_A8g­j9U‰½[É‘Œ±"9&°{.S �ËÓšèÚñzÝÑ㟭[�g´ö ìg’é•vŒKÞ=HœÛ�‡a ·k~yðl•Á¬«´3”Üà8ìqiýö‘^ò–ãÀ�™�Ìα <oe'–ç�l¡�º•7I…#)7÷ÀŽWLuk ë铱¨bkR߬p�}bƒ J¿ Ø­­¹ä·ÖÍñ9¼:¡ºæ¸�ݶ6éùüÒ›5­h‹*Hè\ µòÚ—â[Ê'NÔžÎÀV·²[3Ÿ8Ñ�ZÒ«°…&ïù$ðl•‹UÚiJnx¶�+^Ú'N ^¾ [hRYŸ8±*a/&£WAŸ81�`”IU>‚­r}`©¾\‚-䊗ìŠ(ý·€oÃ~[šÇÙÀ·dº‘g AÌ\°"v ˆ‹î²b^Ïóáeƒ¼ôÇÃZàYØg¥éovK™yZ çdsÎÕ PÁ† ÕèT‰.D4¶Å�2i/Îl•d€ÛaoO¥&;€­°[••GÝ�㲸W+ÇMI¢@v»`wIÈÁ–5Šþ<1Øê`­Œ;‚¹ÜÍQì^ÒÊÁ’_‹9À”bX;G…\¨ âvx¶ÊË)jª‚ø¶÷ÃÞ¯d4A¿¸xöÉÚ�&(¹-ÀØ 8’ºm'ÅœáEg’÷ƒ©Qà Ø7’«ÓCÙ¨®N÷³©`»WÐìåu×7m?‡Œ¢KËÈ®«;Kܹu1†C°‡’Ë­ äЄÒÜj'bX»P2¦‘; <[å�S5‹)B„Û�`PÒÒ/îŽÂ­}HÉmÆîÁ’Tî�(·ÅJÅØ‰Ñ˜£–»ŠÃ3ÀW`‹m˜‹ι¨¢‰WA·ü6ÛöçY]úëϼ,›ù=¥îW˜5ü?ÑQ î D—ÂZ º9× Š?’£†ß£;>M—Ù™LÉ¡Ùc¶ä Š +:65­þrçûe�%Œí´•$¾gÒ£ Ÿ³í¬O޶OdŒ(D'Á+ E(·Ye½¯Á¶†ŒG&[G´F€c°…gñ·u›ÇAZ€rpö°’VŽ~±ø l• tUZ9Jn/ðl±…åÙ'0¹&ãÀ‹°/ªŸ Ð’�36–¥xCBŠ}8{.Ån ‰¼XG›z^€-zaÍ/_ÎÊbÃ/Ú   Û”-÷.Jþ�⑤1HW�XáÍóÁ„ Ö #\bÆòûC®†U"ÀAØB‹_Sm|`X¥‚áè^¥R‹úökÀ”NvQòu1Ä£( 6?pã×j¯9a·µ$Å ¸Ž—ŽP8ähÄŽ“KæÆz§7›®éfžêRÁoJxOhNjáL‘° v›Å€Z«lŽ�ŽâIºàbgðÒ”ñóHúy¥4F'¢ ­6éfp™E�4]·Þ°.7G4u*g»üSžà¹¯°[’{{rqAÏ›ÙØ~kî=ø7Aˆ0º6¦]š\W8[^¯óóײÉhÙÖ 'Å[ EØ[l¢âBÌ­‰j#’jV‰ÈàAØÂW°?þ@ˆ’ë‚}Hº¨pÕ4÷è‚hÚ­<¯’Á¦gÔKÈÉ]²<ýQx†6&.ÔÞw¸ 9ž‡}^úNPÜŠƒ¼f Å;¡ƒàë›] .DŽ<œÄï€,¡œ7¢b° €rµ´j½ 2cÀ °/Ô¾^Pr'�a_”.Ä-,º ¹ŸWUDdø<ìç¥ ÕãH>'™»Pa=ìzeJi0 #k–ç�/âÓ lƒ-4Üâ %·Ø[¾¿k-‹…!‚óZµx¶PÜÓŠµqfêÞU‘2ž‚­r}b�2ŽÂ–0ñoo¢ôO£ãEBw;Ê�}§Ââ,cJCði$=�.�$=#Kƒ{F?‰Ô”|] SšÑßGDX›}ëD6k†ÃËM,ïÄž¼ �À.ØBó‡€a³lÆ CMÀ]°wÕ^œ”\=° ¶�[JU»ADÚ�û`ïK·Ý *}À£°UÞгNÑô´ò}8‰·”þ pö�²×ß´æ[•ràÕ°µwi©ÎÙ(ùºâIš†ŽˆPMnñ§ŽKá]–³Á†Ñ3kdƒmùz�Œh.ÉíNœGÂX¨zI¾ãˆõ½Óñ}ox8¼‹á½qÔÊtXÉÕçøƒ‰e@›pöxò%ŸEÒ&ç|©éÖ@µ.”j`9a�võ¬6'EÚ¸ÙlÓdwõHÇ]'1Ä“tÁÍ£°"LIÆ&’6•Ò8zËf‹ºc™ÖN°’•5fÙNAÏÓn™Ð§Ìß„¿’„ê|4^ =GYÛ2"÷Lx*' æõFt”„N4‘Pôð®eÏæ}‰‡ Nxö©eEϽÿccrç£òZè'<;¡#¢;ˆ¾Ì)âÜì‚-´êPñ—ë�'a'pL4©ª»i€U–Òž†-TëD´u'¶œÕǵü¿e]úT�^âdZASy‚¨'ذHdcQWM{¹s×1ÂØ=É÷ 6’ŽPMÏ01ú¿á£g¸g+¼Ìÿ³‹~fÆJ½h82»+‹ N8{Bú5Î/oOõGªv9V6Áé‚ñæ_³K«ß‰÷ÞoÂó°ÏK¿Cí‘ ¶ö¹Ë5Š[­ø¶Á–÷Ö¤ÕCËẊyçw¸1EøUKh«¡ z„a m]Aµƒ²±âð€“žJ„°Å¦礫zœˆÁVçr©ÚåQr�ÀaØÃ)ty”þ1àqØÇ“o”KÐE„jå�3ükð H�p#ì�ÊÔº)XéâÕ(qÙÜ{[í5JÉmn‡½]ºP†—74ê´‹Â-oV^½§yÀo…Êoð‚VŽz¢x Ò„)ˆP˜;¢ö"0 ;›ÌÜ£1œ{Dº#²7€÷` ‡N\óË×€l¡¸°üê¾ÌÁÎI«»9îån�‰ËЃí%ß/†Š/crNÐ9¤öH6e¹  äëbˆ'iKÈ�Õ8AŸZ=^^áe9±Ã ±Ø»GY¿)¾ØK|‡`'0¾£äp¶üø®¡Üw ”Î1àØBûÍÕøª‰Æ31Ä“týzu*”Z›w#éw§Kã=Hú=JiˆŒÁ¿ ©ªƒ‹·%Äg p'l¡�_|m %· Ø »Uº`N,�ÃËΪ¬ézþH¼dºó4 Ÿ5¼E ÈÔ›5¿ËîåUÞ¼ûº4ñQrLô£H.‰^6qgÒev.g8áEPÝZZŽø™uÌ.Á=ûjèŽpö¨4÷Íw0×ádó5`@¨>‚ïör�`ãLä4ÑÚì†Ý]ûŠAÉ5{`‹�9âŸ\vÈ/çËŠÛŠýᯜˆ"^�-´s~Õëˆ!à,ßÿ>ÀL=ܵ�ZK„õ™¹¨š‡µ$‹Ô�~îºñµPà×jËAHäëõÖà‚ôp/oýx/Xn…-~‘�’­lDe'° ¶�™¯NPrMÀvØò§PO°‚¡[nI(¶ÎÞ…˜™·m¿±]ô?6( …/9^QáÝÀç`?'MürAÜ+N‘[\ò³[®QžãD½Ä£>…êˆcä�Ýòú™‡ ɹ«ú×A„±Ð~’/rÉö©Å+È™ŽÿBºç×û¢Çr�Ã�MøµaIIúf-ìä"LøÖ¼oAª;]Ћº \�`ßÃnØBcÑÚ •‰ÖAàIØ l±¡äz€§`Ëo±Ùê·ßžáwkñª˜˜Œ'`‹m`À!,¹Jõ­¨H&\©¾ éÛ”Vª³þx œ"н]òâƒÌ°‹5²cËÁŽ¢€�¼¹÷m1<û|r¹÷íȱoWš{Vä^å¬ãͨo�a?ì~áŒj–Uýw@é&¬úïDY}§Òrã>¨ö�«�¢.Cðt+‘i¶h‰�n¥äê�êN·B#ñÉÆü¡?m=¦ÀkQ_š_*»$0#ã2Ñm^�-ï_›52:L·s´#. ‡rÖr˜¸�Sâ`âÈËÿ» ~Â1ØcÊ$¸#>j¹6qcš{ØòÝ�a;l!·Ÿ¿YA¸önébmg}4ß'9ºËÓOîÓzDª8 {8¹Æóo ?Sl<ÿÆ*|"O"ÓL°ñü¨„êO5œk†i¬$²˜@ìZ�'`«‹ð(ßÖ¯1às°…<�ü…wøV÷ƒ1œ€-敎Ú²Æ?À8yýmä&a l¡ MmV5ˆV°vñ¾(¹�À~ØbÞÔø§ŠÜDêð"ì‹ �b¿ù;Zª£XJ¾.† �boNød/ üP å—¶È–ÛkaaÂ�í� ¬~Di¹q{¶~d>ž-"ÓlÑólQrõ@už­Ãñe�EÝ úò`ÓÆr¥¢íŒ× ƒ-çLW~�¨M_‡ýºÂb¬É@"{xöQÒk~yø.ØïJFÕÏuØzòÝ$%?CÑ¢ñ÷‘ çFÅT×;±ýRûñtËáÇ‘÷¦Tÿ9¡xnpmïªÚ}ýC-<¥!E}êW™9Öço–LǸå�×Ý¢ž1úz§¦ïÞð‡½~?c^~ N¥~vè[ûuK·l�î#Yûúƒ)öDɳ‹Žiy}o³ý~—nîžÌñfÆ?B~ ìoQVIdmËsçíÅ*IoF+ŒßZ;y®›ßC<’§LÊëz£·�¯"/@½Ø»_”úš_nŽÃW˜)U\”\3ð<ìóÒ*ÞœpÈÛ À˰ÅN²¯§Þ-ÙÙ«¡RH·€9عdtÛ8^¦-@úð%Ø/)SìsÀ9ØsÉ(ö pö¼´bùcÙRú&ð Øo$ß+þ»PãeTÓ9÷Üâ?\¹4yy9;.0õû%^’ÿÄ{`÷(¯Ú;WÐÌäu—÷ŠåŸÒžó§@´I”è;Vñ5ÉÖlVûªôS( Â}°÷ÉW%împ”~/p?ìýÂò¨«"�¦ììD±èwþ�O�“â€;`wÔ^ÿb ì„-4ñYYBü�ˉÀà^Øê¦Uú JÂ.Ø])(”ÒïöÀoÀª)´e…B7 'ÏŸ†4›4µ¡ÑªÈô§!ÍŸFöÔ g�¤L‰îƒ-Ô¢ñÉô§!MÂ^ؽ)È”Òß<[ÌÁù éeÇÐáœå¤ø3P%a‚ éÏ@•„©6¤D`0Á†ôg JÂ4RJ¿XÓ†4¦P‘†ôg!ÍŸÕmHÒüY-冔0`‚ éÏBš„i6¤”þ~`íÒÆììÝÓg–м­èÏA’„m°Ûj/ÏŸƒ$ ¥â2ÈÊ“ìvÀVÙ‹T‘çÏA’„�°ô"Üò¤ô÷¥:‘uå¹5¾¬ÄÉðç!ÊŸGá4i‚¡4øúóåÏCõ¢º�èÏC!?�ÒéÔ—�øúóåÏC„…!'PJ¿ Ø [¨û\W  ¢NÑ_€" wÁÞU{uþIØ[¨Õ–U'h²vVQç/@‘„°ÔNnuRú�@©ÊùNÓ¤«�L×sE¦I¿Uþ¢–è4é¡Ê_ÔRž&ý"І0ÁiÒ/B•„iN“(ýn`�V«iRsvöºá]}”1Š7’¿²|´Ò$ª>‰¾²|TQ¯©Ø�! Ñ÷AšïƒVöŠj…O¢ïƒ,ßYlÐD»V9‰¾Ò$d°Y-ºx_¢“VÎæ¤÷¡H»øÿE¦ÚÅ�v`‚]ü„" Óìâ)ýN`íºøÆ@�ÁžON~ï‡$߯%:�?$ù~-å üû!Ë÷k‰NàßI¾_Kwÿ~È’°vømËòñ�þtùK Ø$Z‡ø4úKÐå/!oê…óFR£D  (5‰åÓè/A—„=°ÅÆ~r¥ôPÊüNN¦IwÊг·­‰@°¶ÊµÞ*úü5h’PÝá{~}Rú{�RK½ëês{LŸ"þú_‡0 ›4µc±*"ýuóב9õ™#)R"Ð ”Œñ‰ô×!LB›¥ RJ°vo-fKSFÁ^:üñP%a‚³¥ß€* S�-�=ÀgK¿U¦9[¢ô»�Rô�ºùr$&N‚¿ M&ØÍÿ&4I˜j7O:€ vó¿ Mþ¦–n7OéïÖ®›ß&‚äÃÐ凵DWå? ]~XKyUþÃ(B©-ŸF? ]öÀk»ä4Jé3`íVåwfgïYoJMé Úü--ÑP ¿mþ–&JAV§¿…"”Žñéô· MÂý°Å¦Òr:¥ôÂ>¨\§[ãa"9þ6DI˜ gô·!JÂT=£D ˜ gô·!JÂ4=£”~°¦žÑe�ŠLêÊü-QÏèï@™¿£¥ì%=@¦%æý(“P�g”;º%ßCy~’$LóL,¥¿øÄž‰ý$tùI-ÑÕ·OB—ŸÔR^}#]ÀWß> ]öÀ›�Èi”ÒgÀÚ­¾5ggŸÕÝË6]Èâ¼®¦OA–„ Æeùdù)-å¸,ŸBù”–h\–OA–ŸÒÒ�Ëò)T‘OiµŒË"±ÉæÓÐ$a‚›l> M¦ºÉ†tÜdóih’0�‹¬Ö+ý½1T{�Ýkèy×®�ò¿ÁK¨fƒ;>Öª2⬟«ëe[å+;89~V ï³"ì�-ÔÝV)¤ŒmQ̱*)o2Ø,ùB¢ä÷Å�¢Bj¯²äÅIòs(™Ï!¯EóŠ»”>‡’ùœ–êê(%ßCsûe}xj¶dúÿpäØÙÓ™§³¹Ñ̰ßz tkxõeªCQY”ˆI31¹ðårYø,Ÿ¢\:ºJPÙuªZ>Ï,›]bŽýhɯk#c,k3Ëö˜‘5=ú`^¯º [ùöÍ›WoU’_¬ î°FRˆ Rû‹ðo›ÖtÕ÷f® ž ?|ú+«¸Ç?¬_S7¯Z~/oZsËE´™˜3ñ‰Mæ_Þ?ðC«„X½Ð�ÛÓ“/f¼H—ÁzË?Ô¸:±7)ëòvØrQoYMäåÚY)÷5•·Þ¯¼9“v˜UýŠâ¦�´4C<‘¶~A¬…9Èîä Ý5BågíL‰²\Æ ¦Å¦Öµ¨mÂØ#ÒÔ¹s�’?C<4d6qß¿:u©¹§´pB¸ ö.rUæ–^¨4x ÅAXa;DRECÉ·ÇÏ“Q4Ôjo¶ÁÊ£Š©>ý@Ï›º[%Ý À ‹­I• %¿;†x•ÍÄkgz¸íËoÿÍb)6@nTbÌÿ�Í™ †|m–Z¬LyVÃùF›Pˆ„ÏÃ~^a�z¦—¯TÙ6¡ oÀ¾‘|�Rò7cˆG°@ë—NU÷ÇÓ(‚ñHfˡ՗“\–%5À†††ø¯E¯G¹‚}H¡vJ®>WI;Ñ`³¶b˜™´v6‡%^ÆU¾ Ní4Èҡ϶Æ�¸”µJmÔF’'³Fh¤q¥ÍÏ,`ôôj'ãàÓl†Ý¬¬oñGÌcc+§¬^­{•rë¸ü5±D{°vŸ(ý5¿¼ 8{\ºâ70;ˆ¿Æ½˜@4ίÁ¾&Mg›î’÷«äXἜ“Ô–P’nƒ½MJÜUV8 î‹Â·@„#°…f@üꦋÂ/ ÝØDd÷Â>¨DÓô‹mÀ°…fbU²£Ê‚Ç|‘ð$ì“ò}è�@¾žŠ!eooúœ*57ª$£°G“APò§cˆ'i[‘Š�§Ö94¸‚gº ë�Û` µhiõê,3¯;zÆ3Dì˜Öͦ<Ý´Èœ¾{ƒWÓ„-À°UÖè*šŽ¼å„'a+¨Ñ¼b"<Cá-G£9am4ý”?oâ$Spè+ Q‘š…§ÆŠ¾  †¯h×7]×HØólæÿmÞκ"œ·�Ã>^{Edž/iúJ)ù1ö•VLµñ�îÌŽæJ~¯¼öviKeÁvÔ�妺Ͳtvhá¬;Bq/I•�ä+½%ÕF¸U#Ôâ×+lš­Õ˜®!Ü [Ì;ÿ´³—·”ˆFpì}Òt˜n±é“˜²1o^÷˜iùmžé¹,çØÆÉ �ÁfÊ´Ô9„NÒ/žNžLfª´“ˆ—y ùˆõaàYØg•Ì™vBQ„ÏÁ~NZYuC¼ §ôŸÞ€-ïÄf3ó†_ç(ß™kx,ã+~Ö`%êÆMožWá­Pu«2…WRúî@éÁþñ){Ñ�Èåüúid¹ÝÄò ðد$£ù]ô kÞ@€ÿ pö„Õ·¢>€ý ö½J+*á«°_•ùF8Ê[݈Ák@¶.Íäd–ÊÓ2üÞÄ`V©0ë� ís|0* O}ü&íºán(v¡Úª››�ß¶2[²Kl^_0XΟ±ºó>Õ’K3WmÈ+è æ–ƒ¦:ÏL�÷b+â�ïuƒ¦Â÷ºI¤A‹-Ç×7h­hÐbA¸3bxxö™d³ac&ò€8GØ^ؽJ2úÅ­À³°…�ß�µÇp öX £Jÿà9Øê–wž~° çK•Þ‡Vž¤9—¤äëb(7—ì�¥C³’æâ‘íÞh ÇÉ$v¼P‹íwybfµÄk‹V>¾Ø{”é¶jµ¥ä6÷ÂÞ+]@'á c¶•_ò;ÇÙM u+ËÜ%+3ïØ–]rýOŒpKŽK�?¯´ˆqðì;ÒÌOß½±îþ >chnh€W}±S/ÁÈrCˆŠÔ÷ô½;W&f®òJŽÈ OÀN`qŒ’ëž„-?\«*“SÀQØbËTËäÊÕWÅÊdx ö¥dÊä4ð2ìË Ê„·RSúW€Wa_UV&[&oM_�ša“·fnW#VekfìäsÐÕׇ¨¬\ g¶J²€-°[R¨+”þN`+ìVeåÒxeêö63qéFµú²^±à°~æuOˆIË.­¼Q!°…6,¬È†þp§ Í#i2\Þ~jXsþüyˆ±;œ!óÖ*¢yx ö-iº½+'ôå¹<ÍìXFÏçyUÖ…öš­;õÜ)ïF#‚—�÷`ßKfæÙ2.ëC#ÒÃÀ‹°/*™zÒ/öïþ_û΋’Û|ö ÒòÞ¬êò�K‰Å‹À×a¿.Íf ¼i ¾ëp‰Æo^²K¬Pr=Fg�…ª]7ªa…ÃdŠªÝ69g‘›¾[¨�ù«\󸌧‡Ÿ^ƒ}MIu£_<|ö‹µ¯n”Ü ð%Ø/I ¼Þï@<Ãá­mDâeà»`¿KšÌ3´ò9Ä®Ù3-Ÿ•žñÌ…`‘h ð»óv)Ÿõk\Á*Þ¢¾ä²¢ÿ{ü/Ѓ Gø ìg”W¾-ÙYá®xL Ý7„ûaïO¦âÑŽRÐ ÝlÓÖÄó’¨tô‹¸Ø!qÖkjGœU*ƒ4–qò»W)ýCÀðÅñO¹ýб“ÿš:o«¶> yÚ4¨}6†x‰g냬áf³¸|*b�3–2*º›C(Óè«ãÈg Qª‹!ÁV°^–UìÆâQÜ(?¶Ó¸Mjz€Ã°‡“iš·�Ë]%u жû7i‚~犿\<ûXíèX£ìâÜ  îâ\‘ÍÇYÆ.n¸3EgY#§ÓàߤðlËÇçƒ}Z.ý‘Û5@tG€³°g¥ioÍÙ΢îd]òep2:„Ì#Œí�W\÷šba>¸ë:½OÀVé8_§Þm�~Ft;€` ]ÖüòNàIØB.}¾:GÉ5c»â%ÅËHµn©X´�Íꙇ~~»a%£õ,Þ*FìF�÷` 9‹VFÛ*·�³0¯{þ<…{8[‹’‹ÊP1ÕÍþ€ÄÓÍ|¥½×�ZŸ¦rÇÝÓSòu1”xÔi•tÒ‚µß’h 4\ô¤v;—çK.µFà~ØB³±€g›löõC×âIº�@@¦$¦£Hú¨R§fæM—¹QX=sÁ褦 D+³ gÁ4#h HV¼Ôc~¿ )Ý ©hJŸñÇ¥eÍÛ9:õµ¼ Ž†5ØcçšYÿ«�W›{?ü HÊùQ⟞vKàåg¿g;F–;cdKŽá0Ór ǣ̀þKf ¿0ȦUîeÏ!&< [þ¨âQŸ—kxeZÁb’ÿ·åp&ÌæŠ.w¿1 ’Ã+U/Ixè&¹Ó|…x¤x’ñ€¯ È£h±ÔÈÁäyŽqr>žÇVf¸ú�%ÝÑ„ŽãXµIà=Ø ­+ÑÀ²L\€ö3Àk°Õ¸¸éOïÃN`Eé¤Mølù%þí”þ‹À—`¿$ͣů\åÑ£P„ØWr[B�œÖDì(ðl•'ßkâ´&²=À>ØjB{Ð/vGa�Ö¾Qr;�§aËwk]lqÞô»e¬ÂÌÒöû\Î̘¾œykQ;œ�=#M±‡Æ=–m –� ›où�6o˜o;‚*6¢U¼‚@tl3õ²~ïúfÉth\i1¬uÅ †?X›Í‡§øÛŠ |B“ÛÔ(d »|öËɵb!SˆìàMØ7•´ô‹ç�¯ÀVyD¬J[q•�ðl¡óW’ \”þ«À×`¿&Í£aÚ0 œtbç™Â9©&Рò±ÂsÎògF_ovÖÔ³ ºåÏoz«U¡ªÛVOâ‹„‡a - ò‰†’kÔ–·#(–daµ2j¾u¶¨çzóŽ]š›ç–1ꞃ-t %(·~YÏ��¶ÆP.|�VµœªÄš…r åΔ­HŽÝs¹Ï�ŒÆ°ö¸´7 Íž…}6™NIvi�(·kË>ïvM"påš_Þƒ-tÆŒ¯•¡ä¢XVÏÀ–w-õçEòj”O“'Ò|Áα .oU'–ç€Øe=Fƒh´ú5Û`«[iØzúd,’šÔ1ðTá˜tAéïvhkîÙ݉MÕ\»`D3Œ`“šeøãu_c£ˆqò<ƒ<"ì…Ý«LDÛÍBÁÈš¤üq63u�û” ÑêÆìZ7”Ô~àYØB�²¤Š(ý1à3°Å÷ j¼½ùY‚P]o~˜ÝœÑz>¿4ÀfM+œ//ÅÃmÑ6μ:í¼Ø¡¸¿ß:O¹»ybu 8 {2™n¾_ÆÑsaôîôK'€ÏÁŠ;ÃW©)¹Aàó°…b´¯ŠÀá7ÉY{xömåR•Z  jo`/$£W™ ¢û8{N™hïa/&#Ú;ÀG°¥ÐQúKÀ·`¿%Íãlà™4ÝÈ/‰säfn9HLEÔeżž1æÃyxé�…õ#ÀX¯&Is´hÌÉ&¶l]޾¯.ðÞ† ÕèT9[I4¶Å�2iW9[IÉ5·ÃÞžJ{L v[a«;ôZwà¸@�ìV¸¥º–² Ø»Kº@°¬Q4¬l°˜o­<ñŠMwÜÍQì^‚})¹�ñ¹°˜T70Þ±b`\âwy�‹al¡©w­�ÕÁÓZ9c`'4–?VK¤÷OÂ޻旻€ÏÁN``LÉEQ”ž‡-?0ÞM. Ü?� Ç[Õ‰Õ ­ìÞ l17WüÓµ‘éÆÃz`ìžäÚ£óH’P]{ÔϦ‚ÍXØwìúÆ¢Í\Ï(º4豌Œáºº@n��áì¡ärërè‚ÒÜZ¤¸ÃÚ-RHžÈ&r‡�§`'´ÇFîD6n€­æýâ`l±¢Ö-5%·»ñBR¹¢€–+ƒÊ¾f‘‚»ŠÃ3ÀW` m.¨0_¤ˆ&�´É^÷lŽhÐ-~þ¬Ñ²ÃF=ØdRN0§‰¨?Àõ¢I'ãÁ’PMÌ÷ø·ä¯ÃŠÅ3<À'4Á iø:mJnxö³Ó9Ã23ë+¢qxöMi:Gûüq�Y(:vç¡PÔ=sÖÌ›ÞÓ3Žíºå ‡Ü“†— %Buq¡Ï–¼@ôqÁ_¹4ÉÜ¢‘1sf&ƒ:ÆKöe$”¿”«I¶¡ý�1” :¬U•~•íO�„ê¶?m`œ¹ð`âI×'ð ,ß[`·Ô¾5¢äê�ˆkM(íèCá1‘ÂivÃîV7»»uïÆ ‘¢9ìƒ-4‰¯hz€ý°…¼§+gwÜ .¥x¶ø|[ãm4^ ‹1À�WW¡ÚFCÜ=D|š€»`諾8)¹z`l!¯”ªvƒˆ´kË7œ·k*?„Ú ¢Ò< [¨âðM/p¶Ø¸;þ)»Aé‡`){ýÍA{a¾U)^ K0®”â”�’¯‹!ž¤i¼ŽˆPMnñgŽKá­`³Á¾Ñ3kdƒÝùz�Œh*ÉíM|8Æ¢.Kò§ðX4¨ï�Ž�è{£¨Çn‘ ÁÄqZÌtXÉÕç îWÐA›pöxò%?‹¤#LÎx©eÒ­�ÔºSª�Yä@„5ÚܳBØœýf4˜ ¶i²›{:ds̤Œx’.¸ +”d<‡¤ç”Ò8zËf‹ºc™Ö°’•5(ª¨SÐó´a&t)ó7áó I¨ÎGsáÚz”µ-c rÏLÅoª,÷Ft¢„6àJ›àÂJÏæ} Ä /À¾ 5¢¬è¸÷ßblLî˜mµeÀ°º,fÑ—9)Eœ›€]°…*þr=ð$láÓ²�?ü~R!TwÍÿ¢,¥? < [þÄÖ‰h)n9«Omù ïdңƅ—øCdÚCMåA¢ž`ߢ7¿"ì°éb»"wîæAŒ°v�4ɉÉÐñ çxtC�'ñ>fý·ˆewÑpdv6@�pö„ôkœ�m5¨‰öŸ…›Ïta óŽ/–¥ÕïÄûxž‡}^úÚhoZ°¥Î]–2·Llð!lƒ-ï&9H«v–±˜ónùÆfR„¯i¡-~EÐ#TwýgecÅ~™“Þ› DØ[lD(qN¹ª«‡X1àlu¾Žª} %× †=œB_Cé‡}<ùq²]D˜ÒpÝEÒnº4<$í)¥±q†'@ ©n„½QYÝÝ,¸ñÖXⲸ ö¶Ú×XJnp;ìíÒ…2¼¼­R§½nyËôê�Õ~!T~;€´rüÅ3¡&Ì„„¢\µ�YØÙd¦@�áH Ð%‘½¼[ø.¦5¿| hÀ6’Q÷E`vNZÝÍq×,wßD\æ€l/ùÖx!T|“óÅHmQ6e¹  äëbˆ'i��ªñÅ>µzö°ÂËrbG–´ÐKØ»GY¿)¾æL|‡`'0Ú¥äp¶üh·¡Üw ”Î1àØB»Þí–6Ñx&†x’®_o¡NE˜Rkó6’~;]ïFÒïVJCd þ¤N¨~ .Þ–Ÿ-À�°…6 ñµ%”Ü&`+ìVé‚9±</»î²¦K×£–Lwž䳆·Há¡z³¦ãwÙ½¼Š"»€×a_—&>JnšÞ¢cÉAÓË&îLºÌÎå 'ŒOXЭ¥åØ©YÇ\ðçÜC±¯‚îGa�Jsß|sN6_ „êc!K_@A´¶»aw×¾bPr ÀØbcŽø§—×–óeÅ�ÍþðˆWND‘¯À–ßI=œ2Óu'ÑÙ‚¶`êáæÔZª ¬ÏÌEÕ|9ŠgX7ú¹ëÆ×@�_£- ’¯×[©§À–:Þúñµ`A¸¶ø…^«ë‡ÐŽ:¢²ئ•/˜¯u� äš€í°åÏž`C·Ü(®QlÕ'¼t43oÛ~c»èlPh _r¼¢"»�ÏÁ 뻂øå‚þÐpʺMÛ5,×(Ïq¢^b€QŸBuÄ1òÆ‚nyýÌ n¨êï…þcQ›$_ä’íS 26Šš�3ÿ…tϯ÷E�凛ðky†Â"æJùhA _á}�¯wÂK°/I¿Ç8ƒU Óbº¯-—¶®…êrKss†ë¹+")dl‡Ú2ÞWøzÐ&”ÛÛ¦v ù Z¸ÄO¸ ö¶Ú· ߀,ø†ò?PáÐ]ªÀÝ‘‘À=°ÅÂ\Æ?Ýwõ‘N÷y‡Û$‹¶/£Ù/÷«�¢.Cð�-‘i¶h‰²¥äê�êÙ4QÒÆü¡ÿáe"å¾4¿TvI`FÆ+d¢Û ¼[Þ¿26kdt ßnçh`¦‘ì¬å`u+¦ÄÁÄ‘—ÿwBý„r1%+ ˆ�Z®Mܘæ¶|¤@Ø[È­À§ÆïBV[ºXÛYÍ÷IŽîòô“ûÐ ‘êÃN®ñünäaŠ�çw¯Â'¢ñ$2MÀÏïFÍ T×x²¨á\3Lc%‘Åb× <[]œIù¶†x�£»Bž@þÂ; |¶|„Gî!%#†x½ýú�Þ¿=,OíoSZ‰¦äëbˆ'‘,ø¼ößL7 þ&^;Bá,ë[þÞœð ôñü­ª÷ñÈ·`Äë ðìblRr=ÀQØ£Ò¥&ãä!&§�—`_.¨ÙZõ=Z8Å�0áéî÷¢&}¯ÒZuøñœ<¼yõ½1€-o³lÑ}Š+„‹îûQ\߯´èö1פ•аüøá¾?†‡`J.—~9óJséë "Ûéù^äP_t¥¸kx^xx/c[9sŽÙÁÝÀnÿX¸ Ê}Èðb8[Ì+ÿ´e�€qòúAä&a l¡ MmV5ˆV°vaÇ(¹�À~ØbÞÔø§ŠÜDêð"ì‹ �b¿ùÛZª£XJ¾.† �bÿÞœðÉ^ø;1ì×d—¶È–ÛiaaÂ�í£¬~Xi¹q{¶~x>ž-"ÓlÑólQrõ@už­Ãñe�EÝ úò`ÓÆr¥¢íŒ× ƒ-çLW~�¨M_‡ýºÂb¬É@"{xöQÒk~yø.ØïJFÕÏuØzòÝ$%?CžFò>$N¨® ÙõÓü5hkO��°Ñ±ÓsÙÿV„{`ËýïXÍð´ßœ¹!ÀïýàDØ»ãIh… dÕµÂ'8ÆËÇ�‰ ˜l Õ]–Àßü'¤¡šþÃ/Ú+¦‹û ( ù‹öW@æW¤‹¶bÜø÷ôKù[? …>VÂNØ�"ì*&»®¿õÈ Bu�¿r(ý½1Ä£, ¢Â©�ô?ÀkP©h¹8(ùºâ”ès²t>¤…‘f#Ä#™+M×l'X#7 —ûrÏ_Eá6Án’ªÄ7…#¾»´�Ͻùˆ¨õOÂVƒd�ÍG[ÇcÄhwÂ>(J{Í/·OÁNà¼%× …=*­ÞMA03�¼= |¶XDÞõT»5ðeŠ‹öð]°ß•Œh·Œ/ó`ý,p ö”2Í^ê°õd4{8 {V~ŠÃ:ŒÒϳ°….Q�ë€~-TyÕtË=·ƒ`W.M^^¾lΰü)ã÷H¼$Ä{`÷(¯Ü;WÐÌäu·Úv»jDC ûÌßÑ&Q¢ïXÇ×$[d°Yí«Òo (÷ÁÞ'_•¸Ïaü&Ä@Ø [hʳ²„øïì"{€{a«›xTUèoB•„]°»RP(¥ß ì�-Þ€UShË …N8N4}lž†4? ŽMšÚ8ØUdúaHóÃÈžzáì‘”)`À}°…Z4>™~Ò$ì…Ý›‚L)ýýÀ°Ô¢!½ì:6qRü-¨’0Á†ô· JÂTR"°˜`Cú[P%aš )¥ß ¬iCS¨HCúÛ�æok‰6¤¿ iþ¶–rCJ0Á†ô·!MÂ4RJ?°v icvöŠîé3KEÞVôw IÂ6Ømµ—çï@’„RAødåIv;`«ìEªÈów IÂNØ znyRú{€R�ȺòÜ_Pâdø»åï¢pš4ÁÍ,|ý]ˆòw¡‹zQ]È ôw¡�ßEétj‚ F|ý]ˆòw!Œ ÂÂ�(¥ßì†-Ô}®+ІììÕðü '½ßƒ" wÁÞU{uþIØ[¨Õ–U'h²vVQçïA‘„°ÔNnuRú�@©ÊùNÓ¤«�L×sE¦I�*?¢%:MúTù-åiÒGP4„ N“>U¦9M¢ô»�=Z­¦IÍÁªÒÕG£¸|¸ò±9~²ü(´Ò$ª>‰~²ü(TQ¯©ØŠ! Ñ�Bš…VöŠj…O¢…,? YlÐD»V9‰~Ò$d°Y-ºx_¢“VÎæ¤÷ûP$a‚]üïC‘„©vñD ˜`ÿûP$aš]<¥ß ¬]ß(¼,ÿ1HòcZ¢ø�A’ÓRžÀ ²ü˜–èþc�äÇ´t'ðƒ, k7�ß¶,OèÇ¡Ë�ƒ`“hâÓèÇ¡Ë�#oê…óFR£D  (5‰åÓèÇ¡KÂØbc?9�Rú (å~''Ó¤K;¿o[yÞFô%a‚N¦O@”„©:™ˆ@'0A'Ó' JÂ4�L”~°¦N¦I÷¾ž7yƒÕ}Š$LpúI(’0Õ(h&8ý$I˜æ”ÒïÖnê7Ÿ7L×»fù,ïf·OA”ŸÒm>?Q~JK¹ùüJåS²%Ä'ÐOA”„i6Ÿ”~°vÍgS(ÐÛ³tå¯B? U~ZKÔ úi¨òÓZÊ^ÐOC™ŸÖõ‚~ªü´–®ôÓP&a�V+/(žˆäUèg ÊÏ$«ÐÏ@•ŸI[¡Ÿ�*?“¬B?U~&e…~ªüLMŠN>XGâèg!JÂ;ùÏB”ŸÕRîä?‹òY-ÑNþ³ågµt;ùÏ¢‚|V«e'¿#;{·d{ÆdÖ°<3g'ÍÏA™ŸÅ&MíZJ•~Êür§^8w$UJz€L“XLáSéç LÂ4€Pú½ÀÚÙ 1ÀIð IÂvØ*oŸ­¢Ï?€& wÃVˆ_ŸD Ø [åZo}þ4I¨îØ=¿>)ý½@©¥Þuõ¹=¦OýB˜†MšÚ±X‘þ!„ù‡ÈœzáÌ‘)èJ ÆøDú‡&!ƒÍR)¥¿Ø »·³¥)£`/þø#¨’0ÁÙÒA•„©Î–ˆÀ`‚³¥?‚* Óœ-QúÝ@© úNݼh€‡?†& ìæÿš$Lµ›'À»ù?†&ÿXK·›§ô÷kÚÍ—õ)ÒÍÂü¼–h7ÿyóóZÊÝ<è&ØÍÂ$dZzÝ<¥¿X»n~gvöžõ¦Ôœþ Ðæ´Dc)|Úü‚&KAV§_@á|A¶ øtúh“p?l±¹´œN)ýÀƒ°…‚%½“ktù®N†_„( t�~¢$LÕ5J:� ºF¿Q¦é¥ô»€5u�. T¤»ÿ(óO´D]£eþ‰–²k”ô™–˜kôO LBu®QîðN”|o ñ$Mã?#"Ä#Ice*c 1.¼ P.ÒÔŸ‚¡\ï·^¥~ZèöÒÿ¢…µ—°ES•c•šLÉÕÕ]å(P“‰@+pl•âªÔäÿ¶ÁnK¡¿¡ôÛ�RûáÞ18Ër€gNŠU&èŸû3¨’0UÿØLÐ?÷gP%ašþ9J¿Ø£ÕÊ?'|jûKP$a‚j¿E¶i)n¨%íÀ7Ô~ Š$쀭`¾Â­NJ¿X» µ;ÖÜvÅIóÏ¡LÂÇëe¦:^'=@¦%6^ÿs(“0Åñ:%ßCáñzÅTé\CÏ»v…”?„—þ¯šÊ!:wü×°n•�`-]];Û*G¤åäøe- ÔþeȳQSé™ÜìKÔ¢#õURÞd°…*‡\!}•$Â}•¥R!uVŸÐqòüo(Âý°…fsÜõßP8„`‹“*(Jþ` ñˆeÀšoÕMe+¤ýï/ðÚš&Ð�Ð7šèMøLt›éoÃÝþð#u-sMú!^Þê·ys¸è˜ ºg /èÎpÎÎg Çξ1¼4ÿð¬óðÑÙÓ‹ÖëKßô¬ÂÃãg-dŽùÿ›³†g†§¼BqDŸ¹ý²><5[2ý8rììé̉ÓÙÜhfØoÀ†ýÊ1¼ê¬¡¨(JD¤™ˆ\ør¹(|’OQ&u¯ÒÓÀAv�j–ÿ#Y6»ÄûÑ’_ÕFÆXÖf–í1#kzôÁ¼^Õ[QùöÍ›WoUR_¬Ñ–1RBTޤúÛ¦5�õ½™kƒgŸþÊ*îñë×TÍ«–ßÏ›ÖÜr m&fAÆL|b“ù—÷ýÁ*ÖE/tçöôä‹/’eðŸÞò5®N¬Tó¢^³”V.î-«É¼\;2+¿¦þÖûõ7gÒ*JÕ¯(nÝHOƒ1Äéë}b�ìèAv'o讪?kg‚KAõ #2-6U¹@ø«G¨ŽÂ•¦Ï�‹”üéâ !»|ÿêÔ¥ ŸÒÂéa‡¶fÁëñ V™Xz¡ÒŒà) a…XI%¿'†xžœâ¡V|3°¶P>ULõézÞÔ+](µe²Q«¸ë'©ò¡ä÷ÆpÕ•Z²åƒÒaf¹xxÁ›P&›jT>žéå+ÕŸM(“Mé–Ï&”I„råS÷¸tªú7žFDˆG2[z+ÔcºÃÏ`�ØÐÐÿe~±{K+ÅR–ÖMÉÕç*é&êÙ7k+F�IëfsXÚe\åˆàÔMƒ,úlk ñˆËX«ÔÜl$Ép2k„FWÚüÌFO¯ö N0>MÀfØÍÊä <6¶Â�$Àï(ðìsÊêÕº÷€µŽË_qD´wû`÷‰Ò_óËÛ€ã°Ç¥+~³ƒØÜëDã<ðìkÒt¶é.s ¯äXá”›“Ô–P’nƒ½MJÜU¶ÀC%Ü·Üm�,G`�$£îÆñ2mÒ{�aT¢iúÅ6à Ø'fG•ÕŒ-ø"áIØ'åûÐ!�|=C<ÊÞÞôŒB•šU’'Ö”üéŠO¬¥hlED(>žZoä°á'-Âúâ6lZEç© ‹ ŠÆ[a‹�°VçÏSÓwoÚ©•÷)ö.…µ§ÊJpSìi[FIÙnd¶#R"Ñ1ªNØb˜J%R7É»4O¸Ø«­Ù‘_ˉâg_º@6c\ÄÛ¦…}´ömz´DXa-!©Æ”p0†j\ÎÜ4š‘Ö¦MjhˆW4&­6ÀnnÕW:nøÕ�¹À%ï²¢?ñÇѶÅ<› oÞκ"”·�Á>V{AÇFïÚqØÇ“W%?C<ŠÞ¾ñA¹¬*¤Ý€×Þ.­b©,ØŽ*!ÁÊ´_–Î-t:E(î ¬T…vUrV›äUõ ¶haÕ&¬p‰B­¦5- a…£?‚‚Ùƒ ¹Ët–7]�Ù9ô�.oÙ±.àiØòCþ}>!¿ác®^0XÞ°æ¼y¦»ÁŸL«Xò¸ï‡0¬°ÙM�æùkþO·˜Q(zKlÁÏ?ÛðYš.Ë•¬pÇU,§ƒ÷< Cxß¡¼ ÏÃ>/ýã3~¦Ò‚ Ë�éA—»ß0XÑ1\ÃYð;Ó ¾c—<‘bØÚ„ã°å^OMæ'‘6$N[öTÔäT�Vm^ˆGc ñÔºy¡ä6jË›�!J–Çnf’Þô|É�qý«­Àý°Å¦µëˆÛàyØB•’¿à/À¾ ]pü[Ì)ý‹À Øò3µŒž÷§†s¼‚i‹9Àh1MÝ@âD%Áø†¶&˜_øçGýÜr"æÛ€°…ò“ON”\ðìKÉ�K)ùË1Ä#«¦¨ æd³ Ú]5ÕÓÀ«ï·BvC„»`«ô‘UQÈn¨‚° ¶¼�¬Ž{;ÆSéHOr#ˆ(‚ðIA�Æ&4‚ ä6Õ� Úƒ„…‘2 Lƒ…[‘2Ú ì…Ý«® ãÜ>U"sx¶ÐŒ©JA­³^ø41"Ü‚=$JxÍ/ïž�}&…Q ¥8{,µQLlëe ú�=UG1ü}1Üì‡Ý_û6‡’k�}Dº¸˜à8�hž€-´â­tœÐ -^„}1™²9 œ€-?!à'Pú—€—aË%GúÈã3«gVÖe¦Ç ú›5XÁv=–±­Ã2ÉiâÙP¯˜bûFÏôMÐ;­²ËÚƒÂ$¼ûú“ÜeѳÀó°…gåk~ùðYØÏ*h{ݯDcxö]i:§|ùê™yÓX0Boæ¬1¯/˜äÜœ-yáŸüÿ£óRŽñfÉtŒlõí¶Õ¨ÇÜÙÁ6™ šàV¹9g’ŽPÍ’ÌÐ�¼nZ,3¯;zÆ38‡]–ñGµt™ ¬åù™Íɹ< ‡` �ÈjèëF±vC•§B¬uÿCÉ Ÿƒý\ ý¥ÿ<ðìÊ^ÿé�sµBº; ‡¥ræ®U”|] ñ*t«,¿‚;"Ä#™+Ý—ý~؆+ñT•ƒA€ã1�qrŒ-KUº¦<ùÝXDä ð0ìÃ5éõ×$Ûìƒ-´Ýz屢ȗà':ü+�ýÀg`?#U@UΧ­v&Wk{×#úhÁ¶’®µŒË^lC¤Ÿ¾û%%C7úÅK@¶]û‰’;,Â.&ß"SòoÆ�$�š Q³·¼‘€“WoXl�Ý¢¬ÙãßòH<:€"º×ªÕ£äv÷À–?;ØÍ+¸Ç/Äc/Pꀀœjc)g´õYÈÓ¦åØ1Ä£HD[d 7ã˜Åå³XkF;Pn™FßX�D>cˆR] 寅uZå]“M×t3_rÈ-“å¾ÿï�.ž¶iåmü5%Ç ‰FG ñ$]C¦4¯èCÒ}éÒèGÒýJiLNXÌpÛ!犣›ä0s~׺Ö�°hÒŽ8V0]—V­6f´=˜÷uŽà'a ÍÕW:±c�“ÌQ Œ�ÈV4 à_X%Í1ž;ò )¹ÍÀm°·I—É–ò¾>îÁQ|/ZêØ®¥$vB®êUL•âfªt«‡�Ú lÊr@É×ÅP¼ •¢ó;JæÆº=ùtÑÈøÓÈŒ.pî|X {oBùž¼[6LjFG SêÉ�¡°"LIÆÇ‘ôq¥4FÃÙKkºLš™b#¹mŒüÛÔsö=)'÷ð%…=*ÕEUÒþî`±NÞD,_¾ [hæÿŽ3Ú5î ]ô ²!â}øìDù¯ùåq Û©}×NÉ�º°]ié×q¯ÀQú°»$Íã†?æ³XÉŠjXðŸ±ÿ`9Óq=fäƒ0Ž4h #=eô<9’Þ(ùâëÜc”¨Œ„7` Í»W¼Ñþ,x wžãµs~‹âzŽÏ‘ƸºÇKô$ÈV¸uC�è@ƶìûJÆHô‹Ï3°3µ#QrW€YØYi­oòçÜÞ1¢`Mئ4•+ÆE &÷~�ØùÉò®�Oì$„XžÞ€­nE¤ö“âÝ­-Oº5‰¨k~y7ð&웵¯`”\ ðì[ò/›3 wùð¶ܪEOØóV="wX€]�&ÙŸ�„�÷�àäÑÝ�½ÕÚˆª®vbvx öµÚWJnx¶Ðöf¹á%ÿl ñHÒ˜ {EVô5Ukh¼Z,�éy_ã"¤E8{Bú5¶ÑXÔŸzgÄönň(Š"ÿÖ®Él$ýÞÖ+¨~âÖŒŽ” káSÿ¾H[ã‘õFq·¨”þp¶Xó$U /A&·¾4¬•gB §wÜ@É×ÅOÒ4® "”[_j{\:Uk§ÿ·à€k„x$³åä~¶<ýÖóy{Ñ%?OÉ¢KL<4Ý,løhC‹ßýëÜÔ¯!û¢.ŽGIê÷³¢í�JfóKä6+æ�G¡»*û�GU®×Á�0Ú¿$¿ï¬â‘nnÏ‚a,’�$·FÆ&nMOöõWõ�U%4 „QX¡3ß+ÝeŒÆr™¾Ã½—uOÏÛs½C½Óaï6Ô\ËÞ{x€®ø7Êf=OœÅ_ûùñ?‡w!¼ û®|—ÄOäy$NX»†maU±µ …]Cß~FÁŸÊz°C>XèXÔ—¢è`üº¼ Š„±[’tÛö‡ 0´ö2™}§sUÉÝ!Â6ØB»V†«Ô ^3FUÉN—GŠa¨!·Aœ06M\˜w�v„j„éw-w£>Ñï—g‹̤ó5®Á_ð±–Da×Rá¼7³)°!ŒEªK¯c™ BuË9ÆÖ«%�aMÿÑßÿÊ+Ç_}•ûf@›0¶Þ�|r‰¦Ù‡ÜGÚª©ª*äÿؼð¤ÈÿE�xQ©üÇÖ—?uk{1ñ¿Ò„±ÅËäÅÿ2YVü“mx`<ÒiæQ)ÖîU$÷ŠR½sÏc_Á›G(>�Þ¢��t„Âa¢VºýÃ0Õ•ïšc¼$_EqöÀîγjK[;å¯zM ÏǼ¢M¢D+תj‡Å(¹z ƒÍ&[ÅSøŠ‚pì}ò­ ÷žJ¿¸¶x\к*òhÊÎN‹†ŽC8)¾1vÀ0^‡;aËïѯã�þ@ö÷Š[ͧÐסJÂ.Ø])(”ÒïöÀoÀª)´e…B'Ç^ääù.Hó]àØ¤ Æà“é» Íw!{ê…³GR¦D€÷ÁjÑødú.H“°vo 2¥ô÷À>P‹†ôrtA¤!Õ¡JÂRª$Lµ!%{€ 6¤:TI˜fCJéwkÚ�Æ*Ò�ÎBš³Z¢ é,¤9«¥Ü�L°!�…4 ÓlH)ýýÀÚ5¤�ÙÙ+º§Ï,y[Ñ $IئIÜpÆ'Ï $IØ»= y�ÝÀØ*{‘*òÌ@’„�°ô"Üò¤ô÷¥:‘uå¹Õ—§éf„î#ÍB”YN“&Ö›O Yˆ2 ]Ô‹êBV Y($‹ÒéÔ¹^( Qf5•× ñ ”ÒïvÃê>×hCvöê##Sòx›OŠ$Ü¥•溺µ: (’° ¶üJ¥€:‰@;P*è>Ÿ: (’°¶‚ÚÉ­NJ¿(U9ßištõ‘éz®È4)Uæ´D§I9¨2§¥�¾]öÀûÉi”Òg@)ð;9™&Ý)CÏÞ¶ò¼�èCˆ’0A'ÓCˆ’0U'è&èdzQ¦éd¢ô»€5u2Mº÷õ¼Éx:E&8ÍC‘„©Ž@‰@;0ÁhŠ$LsJéwk7õ›Ï¦ë]3�|–w³[¢,h‰6Ÿˆ² ¥Ü|P*Ùâh¢$L³ù¤ô»€µk>›B�Þ÷pR´ JKKÔ jA•––²Ô‚2--Q/¨UZZº^P Ê$ìÑjå…B§‚° ¼ µ¡J;Y…ÚP¥�¶Bm¨ÒNV¡6Ti§¬Pª´kªPtòÁ:¯@‹%a‚�|¢,j)wòEÔ�¢–h'_„(‹Zº�|¤¨Õ²“ß!�ëM(óMPlÒÔ®¥TQé›Pæ›È�záÜ‘T)è2Mb1…O¥oB™„i¡ô{�µ;²%;KŽ&‘åxš$l‡-ä7çÓ§Mî†-ÔxËê“t;5õ—hUѧMÆ.RN\Ÿ”þ^ ÔRïºúÜÓ§ˆ¿Þ…0]0lÒԎŪˆÔ…0]dN½pæHŠ”t¥c|"u!LB›¥ RJ°vo-fKSFÁ^:üáA•„ Ζ<¨’0ÕÙØLp¶äA•„iΖ(ýn T}§n~Ú°²"«ò%h’0Án¾M¦ÚÍ�`‚Ý| š,iévó”þ^`M»ù²>EºùsAK´›_€0´”»y"Ð L°›_€0 ™–^7OéïÖ®›ßŠtÚÓ½àZN’‹Ð%a‚[G¡ËE-å­#‹¨$‹Z¢[G¡ËE-Ý­#‹¨#‹Z�·Ž¼à˜bÇ�A”„ ºEA”„©ºE‰@'0A·è#ˆ’0M·(¥ß¬©[tY "]ý”¹¤%ê]‚2—´”Ý¢D È´ÄÜ¢KP&¡:·(wh'J¾7†x½=E®6(þf…”à¥ßâI:Þ ëVñÖÒÕµ³­rt+NŽokaÌ­·!ÏFMåht³/Q‹ŽçTIy�iª¤Ü…ô6*I„ûD+KÅoÕMe+¤ýïÝxmMDŸô�&úF~¥%ü[3ýmcø£Û¿~$ ®e®I?ÄË[ý6¥á¢c.øôáÝÎÙyŠ1>œ}cxiþáYçᣳ§­×—¾éY…‡ÇÏsûe}xj¶dúÿpäØÙÓ™§³¹Ñ̰_/† º5\!¸áPT%"ÓLd.|¹\>ѧv†*\¡©�ƒì:Õ.w=8ö£%¿º�Œ±¬Í,ÛcFÖôèƒyݪ¶Ë²þòí›7¯Þª¤ÀX Ué&è,µ¿ÿ¶iM?poæÚà™ð翲Š{üÃú5Õóªåw!¦5·\J›‰Y�1ŸØdþåý£ÿm•뢺s{zòÅŒI3øOoù‡W'æÖ¼¸_0½ùG·\=hË…½e5•—kGe¥æ×Ôàz¿çLîWýŠâö�Ô4C<‘ºÞ/ÖÌž:Èîä ºÉ0Ð~ÖΗ¸·b3ÓbS•Šc€¿nÔ�9á)ا¤Ùsg"%?C<’4d¬RN½¾¢gšâ϶§�U„‡aN>Û(ù¾â Qmz²2ãªÑ»uêRzÔ°Ö+œ&{|zU†ç–^¨4<߈!Ü {wò…CÉwÄÏ“R8›üg3p7l¡\ª˜êÓô¼©W Ó» %²I«¸ÿ>©Ò¡ä;cˆGQéÔgg/9†þ�³LžF96ÃnN L¢~ŒpìmÉ—ÉÓø^„x•IÏ´‘Ï âÆl 9}÷ó–«ïÄ®åCxö!…eå™^¾Rë»þ:Í®‡’ï‹¡\׳ñqéTum®üHfËþ5­,Ý‘l 0ò °¡¡!þé (´à÷aï¯]Vå t_ɉ#È£-_Æl‰-ZÅ(üÒ5ªäês•jÔf¤µUiFp×(J¾.†xkTƒ,�&P‰� z™J�òFªNœÌ¨g¬6ÂÒIÀèéÕnè &À§ ³u[-Á…Ì+f,üŽÏÁ>§¬^­{së¸|Ì}¢½ Ø[¨§©øËÛ€ã°Ç¥+~nªâ^t"ç�×`_“¦³Mw—oüâ¿H56”®w5Öì,TÂ}Ñø6È‚pöH2ên/Ó ½xöA%š¦_lž€}BavTYÛ†/ž„}R¾È×S1Ä£ìíMÏ(T©¹Q%…-ï¾âî²)ùÓ1Ä“4�íÈ�ÅÇSï0rÈòîêØ¡…£Bù‘ÃjF]Ó�YÓŸT:Kl6ogÒý­SÁd�WÉD± Ø»¿öJÞ�ò"<ûHò¢ä�ÆOÒ4Z�ÖFÉOùÓHNb;!^Œô»A™�…·;uG/žá¸¾éºta¨E—û›·³®ç­Àã°�×^ÑxÁG` �ä¤DÉŸˆ!Eoßø@wæ‚¢Jî½h»UZÆRYЊ:¡Ü÷)Y:4�ØCq�Q¥:´s­ç¨ÚȶªC„ÆnÏSi7`­Ærm�a… x‚réÇ,Ä n8_Ðó¥àvsú# Ò� ;JÞr$š{€—a_V–KO?¨VÑeM{ºµª5)B¹ZÕ+K‡–’šcˆG2W¶\7 ¿ó™×=ÆI¨ECó0*ªæ[%VˆQ ° v—2áVݽIÉmvÃî–.!ÞÕL—sR7ddüÒ2]–+YAæðêˆØõÏÃ>/Íò¬žÏÛ‹.[²K4’¡a í¦ v'—ÏØ);,ôøâw£k7µ³°ÏJÓo£ëÛ³FN/å= è åä;BUéBô' ãÛƒA8 {¸ö%×<û˜t¡Õ³Œ¯:W¤”ŽOÛ̯çxkÈÎ^2æÌêe´½[Àû°ïפñZãvÛ<Ò”¯Ÿ‡ý¼(å5¿|øì’Ñëà‹°_L~BÉ¿C<’4öÌ9Û‰‡¦5 ƒuW^‚±“$•Î� ܨ[YÆÉ¤ ©ƶ))®Ô�ä–.L~gz—V>Õ*ï—æ«Õ ãkÎ;€°…gIk~y ðìCµ¯Ö”Ü&àaØò;<º™žó ‡¹¥LÆpÝ\)ïW&®QÍ]¥ˆ[ð*ì«ÒŸ²ÞÕ�ZDÛ•©¸FmÍÎNÙùü¬žyÈ]§ºµòù±r– ¯_òÕ©-ã˼XovÂrTüåF`?ìþÚ×*Jn#ðlyÏv[0} }Úþ8\·˜á8¶Ã=[ NG�a_”涃f zvA·<}Ο›¹¼´zPŸc ’´-š�emë°Çæõƒ&cŽ?q,Ìú-”ogmÆÉ•�á!ØBmµØ0¹êT†ø OÁV¹"YEí”Üaà(lùÉML`ÌCNŸ�ýŒ²’yç±ÎºEs ø|‘°¶�·aE†ô 0êe +ë2wÞ.å³Ì2üÞÍŸºÚ †ã˜Áz"ÿŒ›XÞ…}Wší)Ä.AçlºXZ[4ê3ßò߀B,äMkŽ»ñï‡ê¥N’WLu³ß|yº™¯´½):íWLi#%_C¹fŠþuÅøº×ü\(ù‡‚¯wÞäWj¶ÁZù ¨m‘Í1¢ÑC±Ìrè%ÖœÉÛ®‘å%: r„êŽZn±?+èÊ?^BÇ@â˜&»iŧDˆ{Èq¤ÿ½!D‰!C¥öª98¾&ºË€¸ŽÀQ8hXgíd;—ØÝE”£­Î½°{E©¯ùå&à Ø ñ¡äê�'aËñéôG.›5Xà!ÐóŽ¡g—ªž^/ÃOoÁ¾%Íoûœ¹`¸âK;#¨Y#åï˜tçrIG(ܹT�¹ñ“©k:ù �Lн+%_CñÑ™�ØÈX27Ö$NÓˆ>gft�ãÂä¸jÊÛesŒhtÄ0¥AâiV„)Éø ’>#M£Vó|rüÕ;´Ä-œEfª;´Ð]3»+7‡ÞvÎÂ#n{´eß(öï)*<ñ5jâsxöõdŠ,zž]FÙÑù@tž„ÛûB&�Ó°§¥ µEûÙ\pˆÁ´‚ù '·1hš° ¶P«\Q;릭*¢Òd°YíeCɵ÷ÁÞ']J,:A7lrÈ› ÜÕSå Þóꊘöo¾©|¦µ 3-Á­Ÿ´5£8{ðÿ7¦ZD¹ XáÆ‰©ýb=pöPí%þLX¼Ã––8ÿ‚¥ xöqiW'så½ÜÌÑM76¿XSáL:¡ãzþ”�é³¶CÇEêà9d#áUØbV׫ƒ;P…7‹Ž£æ�£ä{DK>ùZ8Žš7®¼Ž£æ�C‚õšà¹¾Z8™Œk+œe’êï û—àÜ+)ž^tì¢>G᯹«(‘Þ�}GšdK¼Š _:� #l�Ý¢t¬+¶ˆøt÷Á=ði‰’Û ìÕ$¼�+·ÒFc]j(íX‘¹ž]t#�ñJŠ8î> [~\¾oU£îšy°•_ŠZunå_€ª.hoá]/™ÈçY°;ÉÈ匌?Ìè%7 �e//Ó‹`G¨n½¤¯Ï-e晎Qý/ê‘ ,c‘-èŽÜÏíG�CÂØ¶Y©–Û8Z‰ ûÍ ë2¬Ó±-zskàø‚}Hš+·Wæ2’Ž09ïê(R»"›²\Pòu1Ä“4�ØÀN27¨}|\:U;›kZ¸Ì!E�àM3ÇúãÍ’é·ô‚áõŒÑ×;5}÷†é½ÌÿÄ vœÍLÝ»Úß œ'J~ßà˜–×÷6Ûïw:mq's¼ïvïCø"l¡Ã§“mx�µ-Ï��®ÄZ“ôàK°_ª�ÚÖÍ‚—cˆG’DZŒßŠŸdË!Q¢cc!öõ°Þ±‚Q°�¥±^þ8»Ï"Ë�Á>–BöM"íÕ´]'ã—ªQ´f?³2º;ïׇ¬îéC9 jÕ§ì’åù5ãø±cýüYøèF [òk¡g*P×3bZ…ýÈ1!úσ2alE!qÜ@ÚªQÀÈ~Fƒ8»H7 ÑD6M’ÑǤ è%�ÆLy{ÎôG ¬d™Þ7ñ› K8{Dšx…ånf·À†PÝ –zFûqª*¨Êæ6Æ×K²ÙÈØÛÜTî yB¹£÷ñOÛ˜ÿ?êV³Ž¾èËÉo·O;ÆMî.Êy÷ãŸÞ rÙÙ«ár”{w®LÌ\¥3«ólúê +·%0޲ ~c“7]¯où½Ú˜)¼ÆÔÊz.ùJ·×y%4•ßjPÑ[MãM¦WŠ[^Ðïá¦2ƒäg” ºŽ?Oî!qÂ:Ø5üWåqiG¨¦79»ŸÍDnÓ]ŽUç÷!þø‹y™’ãÐNêØ\–¿Syœ ÏÂ>+Í˲޹½Ñø~ƒ¦b»"ÉÆù KöY”ì¼nÍ$kg^¸“Ÿ –]³t¼MðŒ²ã�¿ _Æ+Æã’¯Ó‘��2ôìšq/…~œ;`wHóÛ»–_4¸å§Ý@KXá¢èÄ”ù*ÒŽP�2{ö3ZA"ï­"…›MÊ.o~Á½f„=°{žˆáêë`C˜þpõ]`@˜òpUGò„êz÷öµÃÕSÇÆ«³`DÅ?ºÙïɯfð„ÿÿ3^ÍâMÕ�WGè­Èû¸N“~orŽëп²„êfØÛ DôŽª¨äÊÿ @IZO)þÀÌá¿7„˜Æddɦ:1‘8aš“‘7�v„Šœ›Á�Õ]´.þ¨•®È®:rå-<]BuÎMuÃÓ<8>¡ÃÓh¦9<µ�v„jTØ’�½bº8 GyÅŸA6ȶÀn"Vq+ä{ú¥Ö¶ŠZ8ß%ì„-üŽom«ˆÌ T«”_9E(7½¢ ®’QáTHú^ûM¥¢å^L¦äëbˆG,Ö|«n*[!Íè^[yuúÆê(ô·fúÛÆðG·ü¨út-sMú!^Þê·q‡‹Ž¹ {Æð‚î çì|ÖpÜáìÃKóÏ:�=½h½¾ôðMÏ*<<~æÑBƟ›³†g†§¼BqDŸ¹ý²><5[2ý8rììé̉ÓÙÜhføÊ¥Éá‚n­½~(*ŒQi&*¾\. ŸæS”MûW)jà »N�hßmrìGKs†52Fá ©O6²¦GPL…*â[çŽù˜ôãGÔ#-D%©ýEø·Mkªö½™kƒXÕ{ú+«¸Ç?¬_ý/7_µ2vÖ´æ–Ëh31 2fâ›Ì¿¼?r~•뢺s{zòÅŒ 3øOoù‡W'fÕ¾°ËkªårÞ²šÅ˵c±Rìkªn½_us&]õ\õ+Š6Ò` ñDÂúeÁ9áAv'o�«4�}ÖΧ)ÂMi¦Å¦†�Ÿ\Yüu"6¢¯4+¤Î�ƒ”ü‰®ºÌ‰ƒF•À‰Ë¹T�Y•ä)r=°E[7ññ™U-<°ôB¥í­±ÈË•ÜxI• %ßC¢°¼<ÓËWªH›PF„ÑÉù£É—%?C<‚åU'=yE᪻Ú³åàêýVþ¤Ÿ¸�ðz²644Ä?µ�-ñJ6h+‚~JK§Ú5öQ×]g¿jÚ””t6‡^ÆUÓ&Nél•¥ÓþHW]cϯdeר7jå h+]FûøÌ]cOš€ÍÚškì%Ûhùkì£Àe„®±—ÚÔø{¢½ Xá{>úk~yp\[s�½`žƞhœ^ÓÖ\c/HGòûØî•Jñ1Ä]Iäרo�,G´5ר×RÝâרÙ½À ×Ihš~± xB[s�½tvT9¦·_$< û¤´v¹¯±§äOÅ�²·¯rUrc¬’ŒÂM~AÉŸŽáªkì“¢±9¡øxjÝ‘ÃòŒú±™Ök˽µÜÈaã*F]´).˜4a0¼âòoªÑÓ¯­¹Æ^Q»»3;{·d{ÆdÖ°<3gwûKøðìÉ´¿-ãkè �^‡}]”üš_>|ö«µo‡ �_ƒýšübˆÝ.–O„T]_/—_`„µÜ*Û>ѽ1†xéh¼�El÷ZHÑi¦ÓÞGÏÛm=‡ö@ÛiOCÉz“êI–]¹ts:ÞFñæÝ¶žƒ-4—X¹¨Bl'•íÈ»íÒùXÑgÙäÒë”K½ÕЏš'ƒ¾´Ø»½ö•{ wÃÞ-]8uÜ"¡ït;aw&WÁv@ ;”V°-TÁ‚;ˆ¸ûò1Œ•‘â¾|ãd–»ó&F½ÀƒZù¾�$:ï§Æ'«­í®Ç¶ Ø»GIoM¿Ø<ûPí+ìŽØsx%•z2l÷é’RÛ îÄÀζ\)Ÿ_bo–ô<�•²2ý1í¾û•tú�–°.¨¾òk•›™7 :g½…¥×Ãÿè@îùŒuÕê_Õž‚Hož…}¶öÂk‰áì±ägŠ”ü31Ä“TG[p}2:Š�1ܮժ£Ø4}÷wO�}<†-ÔTñ÷Ç}Ât»€L[bS¢«@læû` »£¿ÆRr;€ý°ÅüñO�-O0A ÐWÕû Þ Nl�_‚ý’4ë]a<ØÙÕ=³0ÀDº�Ø¢~¥%»�ªc‡cýÅP¼›8ÌÝO˽À1ØB 6Ÿê(¹6à3°Åèø§Üý%.†x½ýæ 0ߪ”ÍËÊ�óeòõLM±dë`×%Ÿï”üS1Ä“4�6ä@„µq(o ö.pR£Ö¿¸öj¥§¤×¢Û¡YÂm°·)kÕ—CéðjöÀî©ÉðaM²Û� 6“p7ë³~e8“zFlš 3¦ŸwÍ a¸<û|훘ØéSíì É×mJþb ñ$M#ºÅ3ÂÚ41O ñªƒ|g¸ "ø^}ˆ‚ ÌjB‡nûC?‡uR®g8îÊ5+ÿoóvÖá¼xöñÚ+ºåF8{$y)Qò'b(¼Ç¹bª�¢pû•v­6àµ;¥e,•�¨â¬M›déÐq°Í1ßYñ¢¶›!¹Gö4’¯×–G÷õšàFc¾‘}ìp¥äô'þi¶qG½&mÀnØÝÊŠh#…ñ)˜hoNì&ú”\°¶üD¿i€n^4]¼²Ä,˜¨ŽÂU–O?ˆ ¼×Ô[Òe—–jkFÉ×ÅP®5{Z–U�æâ‘Ì•çƒ6Ì®a^ lærõb1¸«Y�� ‘�¾ê˜€ÿï‚ z>¿ÄûB=(ZÂX€MÙÊØ–ÿ*­ƒ;öbà¾rCê;_*X�«+¸Á9·D_š¾{#|Io©è3ç¿}Î4òþð‡÷…^‚)}!n¡ìCÒª©>Úú,äi÷jaêñ(jm¶>ÈnÆ1‹Uâ‚w#£öËd}cõAbùŒ!Ju1”k‡ºdéP@þÆŠo£‰z`fÞô+_É ï;0ƒ»âíw}Œ&©t�€ Ó�÷\îËÈ!u Ñ^Ôíê[‘N8~ëǽÜsÙEx¶ÐVÒwô×TÜշоùh%¿W+ïr#¿æ—·ÏÀ>£0[ªŒ )¹MÀ³°ÏJ xõ†AWO·H�£ Ü5Œˆ�g`Ï$ßãF•ŠPM�wwe“äÛ%× H–fŽ-Ù%¶¨[ee†n1‚aEÞ¦[·°p¦{Á› �L�ö+v™H<àq íW?R'¬]ûµ-;;Œ;ןR¯Grpöp2mWóø êı®ŒCvh‚“àŠ¿¼x ö±Ú·[”Ü&àqØBŽÀUqÖü¡¹@ÖŽOÁ:²®p[W”¾XÏK _¾û�dÔ»s|-ö—€3°…:‚Š¿|øöÃd$< ÌÃÎKKx0½ '×4÷ ç�vp›ã#Ó¥I+o'A Àï‚ý]ÒDë1»ç$s$¬Vˆ«®Ÿ¸ô¹bý‘;�=’\?£.@¼¸ö>%•Œ~±xv§c�"‚Óƒ›5§Eú bp x¶Ðÿ�ú‰Xé‹õÄðe`¶Ð¡±~b5öW�/À~A™„/-ØV2> ´aÛÒnú‰`bAÝfÜ»µ‰Tø�°¿Q¾~ÑL‡“I,4Km'W©uÅ:"·˜Â"F]€ø Ú ýâà1-± %EôQ7�ØÄ•;…-´öNÊ�2 ö‚à�†ÈMuØzrÊ�Q ~xöeÊΞMF¹§�ØiåvýA´DG]B¤‹Û¥D´²ÀwÃ~·4=n‡],<§B‡�d¶•_b®ç×tÝÉšoQÈodY<ÞY°ý�“ô ˆÃêj±�„H�/þ\{¹SrÇ€W`_‘.È:n]SúW�×`_“æ11mŒàF™`1¼`ÎÍ{̤0Ì´+Ú&ǼyÝcŸ±-·äÿ‹ËÓ÷…(uy_c²"œ€=!?š¤¶#ØðVÛ)èÛÓ|¥;LÉ]¸æ³ËžnæÝæFŒE4Tjü详•5ÌlIÏ—·(ò¾Ä1'¼û‚²z²ùÞ¤BÊÑ äqMe›ÇÝôRòu1Ä#ØŠÑ¿®Ôš5]ós¡ä¬à·¼‘¿hˆÕlƒÝ&B1 6 ›cD£#†x’.¸ÐL„)éç$’>©”F÷d.¨ááÊYà õ[®ÏÚü=õ)ð"ì†-4ªØS?úoy{h"sP[v3ÔTFH­ÚCSr=À£°å¤ M¥ˆÂðìcÊŠ¥¡¼ƒM¤dN/ÀV×'¬[2Ç�a_”.™6VÞ(ÜÐX²\ƒ?&!qšÞ‡}_šÛSüŽÙѰ¤ŒÍV¤™¦°*³q&²S˜85¥ú)>ÝPr�í°åÇa'ƒ]„„ŸåS–±þ}^wYÖÌå º¾•WUÄx7ðyØò$›±¯3ØéÉ­ôÓa3ìfiNghEÏq|½›.stÓ5²ÏéÛ‹ú9ÿ?tÓrý:^O•åÎÆ.£¯t1}Rƒ‚³H:B5ƒ‚³k2‘-ÎVf!p‚Ð�p&.¬²LÞö¿ÅK ”Ç´Š KL»LkAÏ›Y–)ÇÂå.âg@èMå´kwd޳!’4&ѵ§¸Ü²�NÏfÍðDPl"ÂÉøXV¸ÉKv¢èØ‹CÁ`‘·A'>'€ÏÀ ‹Â§xJnx¶|ðMþøŽ õ Ó¸&±@ñüý¢î6#Ü{[í‹å"”y±ü”.ÞÚBéï¶ÀnQV,‚Þ."Óì†-¼%�¯Lv{`÷¤T& ¸¶X›[ñÚ„à€âPp`Q¤`ú€#šú{Ö)˜^à ØB; WŠs@ÄINÏ›îUlÇ<£P´ÝY)šèyv“(š1à$l¡¢œ�’.†x$i4÷-�œø�C±5X…ΡÝ%Ë-}�Pà½å£ÇÜì.�¡ÜÜ»’ŽënMð ˜6Ô7à ¸Á'àËxwÂØ )Œ�(ýFàØBAÁVÎM‹Búê^s*msS»‚l!Tö£1[*æÍŒîqˆ¼ Wµå[Tä·øs�‚éºäó_ÂØbc©ø§m+Š0tW»U/Ê«Æí:ø¶ÁZnX)¯e狜ÖÜSÌgAçY¥òâîB&‘t„Ân芩n~àÆïa[³G€R{N6e¹  äëbˆ'i±à’¹±Þ“Ö‰ ®N¦äÍkvÁîa0l–Í8¢Ábˆ'éò»‰2‹0%5ßBÒ·”Ò ëšrv>o/g+V¬–“ƒ»¨;³Ãý(œŒoƒ%¡zÇ•äQ"uxöÅÚ�Î(¹Aàì éRl`s†e8f†WTDãð9ØòÓŒ£}žM;C{Á`Q_oæMo‰éÇvÝò.RînÿtD¨î†ãó%/P|\í´:ŒŒDƒ:¿eå¾òé.Æ¢2V€ÙdJ ›ôÅcÕ]40� TwÑÀÆ™ Ó«�*‡°;�ø4wÁ5ò5H”\=° ¶ü8z ëË9½”÷ÆDʧ¸O+GVT>›®MܘæÞÛD\ú€°…z2þ²é”.›:îF—ÒÃN®á˜ Ë1ÀŽ™U¨¸á^ð!>MÀJ®øD4D¤ø¤4Ä¥˜`ÃAÉõÓl8(ý!` ǽ°L±á¸· Õ6‚K’D¦ Ø»¥öʤäê�;aïL³Õ "­ÀnØBK³ [ ârØ»?™²é�-t&C²Õ ô�`‹û 4ÞVã~XަØjÜ_…j[ ™EsbÔl‡�ÀÅ®”\=p7lù͵Mé_Y m¼uïFµ ßÖ-š#ÀAØB?ÑÁJ¡å ô‡�Ç`K®åx!,ÆSl9^X…Š'*Â;:ˆO0Á‰ %W|"&*D¤ø¤LTˆK0Á‰ %× Ls¢Bé¥&*S]ïn½©°µ�)­.Qòu1Ä“4�—�ªÉ�#3óÆ+”Üè¼Æ‚™¥[>Ý`_DvyÕ‹{©ÿepŒbÐmÐT ™'§ø¡w:¾þÐlïë½O›^z–ßýæ´ÜX5o˜+¹úŒåWð „“°'“WÁ$ar;n µWÓ­�¯¢F˜Rm| 9amv.4­9'Å×µp‹°M“�Žñ²lŽ�ŽâIºàޅŠ0%ëHZWJcã ÿV„Y¤N¸öFuS5‘ó�De °vsíG\”Ü&à6ØÛ¤Ëd¹¥´Ë'"u›Kø7Îâ{„#°G¤‰^÷l†íÆåË›³J'žáѲ%ËÓý."ƒû’pšËïVÛ!\î�hŽ0¶sQP[e+&PlŒaÂ; 䀡©œ'b“9Ú´Y²p‹ûò�í¤C×sLkŽ{²fÄð(l± '5ØÄd n^€}¡öm%7¼û¢tùµ±E3ŸgY;úRúåÅÝl§ à}MU¬–�EÙ׋.›]*Ç[à$–ƒÐ !Á•�JBÚ·öl7EY`�ØxP¸µE)vÇ`�Õ^[ô[�ÏÀ:U*×BÒ�‹!ž¤ZÈ9„P] ¹—!°Xx˜š6ºé�œéÖÎ š‹á>ØrN¬ZÆ- –W�`?P(æZÇ- ÞCÀK°/‰ò_óË}ÀWa¿ZûjNÉõ_ƒýš´À;Çüñ+ØN¹ÿ áhÖ¶¸�ä¯×��`?R–-ë9³a5ÐæµTçn”|] ñ$MÃDD˜Þò ¤N¨~ ¹)výïã÷ÑÄe pl¡É_å¥ä6·ÃÞ.](=ËsÈÈU¿ð’W9Dnpö°4ÉÑ Æ�îÏ!g]£¼U‡Ø¢ÿŒn/ „?|ÓCè‹pö¨2­ÉÅù#NãÀI­J§Öš£äNŸƒ-R�?¶6¥ÿ<ðìÒ<†¨A²�¬á¬–TÖ6Üà NA÷<ÿc‘SyHˆp¶Øò¼z9§SÀ ­k³Ör¢ä†�—` ¨$åDé_^�}%ùn¶UD¨¦›­Ÿ:7f�¡š{ÓâßßhM|š�m°…Öø¤JÉm¶Ã–yØ´Âc+PB»�`PVBEÚ¢r8[¨�ã/œƒÀaØò£ŒƒñK1Œ@ÇÜ k ˆˆâ1à ìiª»§�?V‹ª•gðGõ´C¨îÄüõàÊâ²Ì©'µ{,Œ.ëSž×L ù¶^înƒÌgKÿ5ÐE¼¡œ¯?þ)w“þ&’Ž0Õ&ÝBõMºàx"Ó Ä�u1�,_“AÉm¶ÂnM·=wPï÷ÁV·#M¨='*}À£°…Ö]ø §8[lïyüÓ¡ÛÕ^ X®iÛu‡»9'†ƒÀ;°ïH3=Rt ×pŒì@9z9Ü9��«š@pn7TF€ê¶J O®n½©‰/7ÞÌ êC&¸¨“Ÿ´¢„ðå»wî¶¼„¤#Lµ-_ υ·Ÿf`‚ÃsJn3ð ž•ÝÀ'dxNTŽžSr�ê†ç½±6Ç Ç‹ú‚næÃ?ø �="Í»ï–lÇY¾l.Ú²ãýí½{|Ùu'^�@  T4 $Ð ñ”@ÃŒž’†y1CJÝ%©<­nMWµ@v&oìØq뼟»Éfw³ÙÍæ�ØŽcÇNì±ãØãd÷·ùeótì8‰Ù8¶“üþúùW§ê[Ý·»«É/ö'•ïuÓ÷[÷ž{sX�ž›í}0$ì…,k�ýôü„[‡ ù´‘ë÷N XQAV,Û TC¯hî3«àNxòyé÷Øë±sÇÿ�‚s"Áñ�àE¸ò^yÍ ý­Ô[Ú¿’µÐ‰.nÍx¾I©fp�ó߈¢T3Î?9sëªþ²¹z/›s»¥ft§ëy:ž7Ÿ3Íô*©eñ¬”ݯ—¤�ñLU,w¥¾Š7 dbâI¾ÍMo'Ýc¹´dP–Äe#ðô;zQ{Œ4ÍôsFÒU2 ÉEïÀ¿y/meÜ9¾çÜsüç¿ oBxòMùÎGÍâ ÚÆÊTš›ã7ƒ×7+í|£n�õË%AW L³]vrÒ*uà¯âoeÂQÈ£ÒôýØŽÞY΢²óRûVÐ!T·RÕnxB±×q÷µ7ƒ a;äöø Ø¿AѪ1`'JƒÔƒ6Š‹„ GO›†ÍŸäíÛ@—ðäÒÔ»¼¬�tâÊH¡OÐ�«U¡}¼·€aä.)¿>Ì¿oÇ™«i—²Xvâwx²Ði„³_å´U«ÚªÀ]€ùaàiÈBÄBùðäkµŸQq{�×!_—ÖêîðTþ àMÈ7…Uw\ÖN½Uó½óøo÷»�‡êŽwnt}Ç\0¹S÷|;ƒ-�[â«�·¡Þ¦¸62î,Q &æÛ”« öÓö^òš ›NóüÉ?ߎª!”âìþÚ©Ì|TÃE-ê“NànÈ»koÓ¨¸­À=�÷H7�P_¢ÐÜYÝÆÉÚëÆu‘6é†,´ÌÎß& àÈòqY·«kˆÃj¦¸oö¡~àã��϶}‡ß¬ª´méì9’¼µñ ÖÁÒ¿5ð¥µÁ åeˆGQ¯HBDš�-�…š…¯ÓRq�ÀVM"UX™r¶NÁ‹x•óøáNÈâ\¸•ó;¡�ß©T9;ô“Çæ,'È Ø›·.�}'ƒ»! �´¡»!1g-¸¾c‚Wo‰Nع¯özKÅí†,¿•¼ß»­LaѼҾ3ìU)Õ”W£‰àà5ÈB“>¯Ù6ÈÎz¾Kóg:Æ<ëùntªïVÚÁŽÑ.ÅŠé-þ8YJê»ýýú½E+¹¨/«:åÁ¦��¤e‹ìe|7ƒ§!‹åª·ïA]}�Òz;ËÔ›Q\*×W̤“͵·`­x÷ãM}>O—sÝ*\âw;¾‡Á ÈB‡¼K×zr¦wZ%ãx‘CxIý[T%a+d±ÑO¨U߉"ß©¸7à ¦×2þ~ιÓoÒX0,º&ï„äNrþN¥zCh©Õ®Æ}ªé{�jV—¹Í(ßÀ ž¸çûðæß§Tqv1& ×U�9Wuô§g/ œæ­žïc°r·4¿¤¾·£¯˜º™q׋²û¸Mù÷£Âw@–?­Ó‰ýòìÌ¥egÑ&¸·—~”;!wJÓ;0gÎÓ�Øâ湟B›¥ÊËôÁŽðdñ3FÜ�à‡Pä)íº>oÐè§÷æL'ŸËøl ƒ{ñá‡<ù`|•ôè˜VZIÍzšNWfçõœq�·F~˜ÁvÈíÒ”º{­yfpnµd‹š»Ù~uEØ YÌ‚ 5Û�¢ÈUÚlmAð"ï"‰;ÁÑ9kåGì€Ü¡lÚ4—ÎÎ��ÑÿàÕ < ù¨ÂIh•ÝÆ�iAÎ]Àƒ�… Cè/ïŽ@‰ßG¢â�1ˆçÑêç?†ÎEX‡~þã(’P]?Œêƒ{¥âÇÜY>[oõö:ÃKò'PI?!Ý^ì§›Ù±ž“Ñ¿ ÂÍ�7+³‰ë.ü·T‰ÊV`d!3¡ÌkrT\3P*)@鿇OvwAÞ%?¯.£ÞE!i×�c=5¬»âÑÑa}ÿzdø÷¼éßC�A3™BÖè'Q$¡JkäXüWU’ÁGÖý*‰P�5êa­Qà±yñ)­Ì¢™³}>—]Ò9¹þð#ì�Ü£ÌNmHYóóÔμ¶Šè �C>^{[EÅž€,Ô�?ê<•x ò©øzüOCÕõøM^�·ci™·>~šÁ-�·SÀ[�oÕ^+©¸ ÀiÈÓÒÍÊ¿„CåÏg!ÏÆg0ß M ¬¯Á|/ƒê ¦@,‹÷â‹„m�ÕmÄG*&×l‡Ü.Ý"Wú«ØD&°<Ó³@ɼí¸§`€¸í'½ÇVàÈBKKÞg<“ÕÍûNŽÝN*¼‚¿ •¤ žÙùJÊÝGƒprŒNÍûPäû”öÑ'½,ã¸4Ù濫ùÛ‹^Âñ’,nAÕæÌ¥¬ƒ³ ¼•ù>¯A–O»¼“Å®àNÆ3v�¤BPeß�J&ì‚Ü%ï±ùÜêú[ L8 YÝ"KµDïBiÖéßÀ ž¸i|5 šÚh¥m‘”9oP4þ” ¿ "„­�[• ³m…Åv}\Zê ^ÀÈ=µu_$<ùPÜA*¿Ø¹/~ÕýhF€ÂªaBl?HÉwQÚ‡”vî  â¬“ ù0j @ñÚ ÞºõaéDöÎ×4Í>@<ЬÇ5wpìÍ™¯ä­œy�ŒÄïMLÏܺêŽ9‰~ÝýÄtÜqÒÏÐÚ×ç�ö˜È;Ùe׉qzߤïw�Bci9mÚSó¼ïö¼á³�ŸU¦óï¤\çÄ^ÌÞ‹(z ð9ÈÏÕNÛªVÁó â‘ä1ìºeúÙ=5wÁOtы󱷯_OŒ-¹Nenu,yb:’öGQe„Ã�‡ëP}¿‹²Tc»Ž¤æž¡,¯~s·.ÝÊZr’FÎv{„/¼ptìD¿þ"Í} , �@–�vº›�¹^B˜Ÿáï�¡º³”ümûq” š¶=óm{rìè°Û¸ýzIzjþšüXž�|æ‘jë×Áêõ:·õ'Qv€jÚúñ‡êÇhëBngáæþ}'|òã�TsÿXýA�›û ìÍÓöë׳ÅY<7«ÿ &„r5öÓ[2Jèm¹”Nïø[ýÿ»Þ‚,´Þ_3½ü_`õ¿¤õ2ÌÉm}µOÊMýCÍwM wAºÊï¦þ!*ãëÜa©ü= âQVAãDL€èµÿoM¥­àžRñ ŠOOIEÇdéü‘æïS(~xˆý´û†ôóâù© ż� f†‚âÚc:/Éÿ�æ"ì†Ü-խú÷ֺɴaó¿ûcÍ¿íýÇ Ú,J4b ,âp0×Ô!ë ‹�Xyûc4á>Èû¤u§�{ÑŸÊO÷C:Ïã©EC„z4§æ&<7^$©ÓŸ@;!wÖ^1þÊ@¸ ²|$‚†ÈÓ´‘vŸìî�¬ÎîGjèŸ@+ Õmñk(•¿Ø YÜ€Eih{‰†När�+ðÐ<ÿªù§àج &mäSÓ?…jþ)ª§Q¸z$Õ”èÀ}�…,Ÿšþ)T“09Q5¥ò÷@¨[Å�^ðöûE éŸA+ c4¤­$¬«!%»�1Ò?ƒVÖÓ�Rù{�55¤Œ†ŠÒ?‡jþ¹«!ýs¨æŸku6¤D@ÆhHÿªIXOCJåïÖÎ�6 _ëý ¨$aäŽÚ«ç_@% w@–Ð) žD`'°²ÊQ$B=ÿ*I¸ ²‚Q„[=©üÝ@©A¤ªznvÕÓ²“þŒš“á§ ”ŸBã4k‚y¸øôSPÊOA/EõBVA? ùZg—KZËOA)?ÅX#¬r Jåw÷B>«*èÆÔÜä}3™� pEï/¡‘„Û!«Œý¡� �$ì€,dµeµ“ì²wFhç_B# ;!+è�ÜÚIåïJuÎM“&ï[¶c‹L“> ­ü´ë4éÓÐÊOkuž&}MCã4éÓÐJÂzN“¨ü½Àn­VÓ¤–ÔÜeÓ™¼Ÿ4—‹Gšãg –ŸÑ$£¤ò©èg –Ÿ�V4j*vÂTô3PÍÏ@Wöˆê ŸŠ~jù¨ÅMth•SÑÏ@5 uÈz-†xWE§2óYNz�$Œqˆÿ+h$a]‡x"°ãÿWÐHÂzñTþ.`í†ø&O;oåÍÜ*'¿ÏB%?«Å:�ÿ,Tò³Z�'ðŸ…Z~V‹uÿY¨ägµúNà? µ$¬Ý¾µ¨ž"k  ½üklíC|:ú×ÐË¿FÝ4 ×�¤Ž�. Ô$–OGÿzIØ YÌ÷“ÓQ*_J-?h‘iʦóc72i^#ú7PJ™þJIX×E&"° ã"Óß@) ë¹ÈDåwkºÈ4eß6ÒVŠ“ÞßB# cô@ÿIXW”ìÆè�þ-4’°ž(•¿ X;Ô5ŸW-Û¹DA“y»}Jù9-Vóù9(åç´:›ÏÏ¡U>'ÛB| ú9(%a=Í'•߬�ùlöô†Ÿ…Œ“âç¡•Ÿ×b]ý<´òóZ�WA?Íü¼ë*èç¡•Ÿ×ê» úyh&a·V«UPhè´içÓÜúhåâÕÐ/@+¿Po ý´ò ñjè •_¨³†~Zù…šj(yo‰WA¿¥$Œq�ÿ"”ò‹Z�ù/¢‡|Q‹u�ÿ"”ò‹Z}ù/¢ƒ|Q«å ß–š»•Ï:æTÊÌ8Å(ÇIóï ™ŠÍšÚ½”-ý;hæß¡v…kGRK‰@7P×$6Sø´ôï ™„õ¼Bå'€µ»²‰¹¨ÈIðÿ@' ¥2Sóéçÿ�Nî„,d¼eõ“twAV¹×¡Ÿÿ:I¨îÖ#¿~Rù{€R[½Uõs £Ÿ"ëõÅü{0lÖÔúbJú÷PÌ¿Gå4 Wޤ’�½@)gŒOIÿŠI¨CÖë ¤Tþ>`r¢³¥is)»"tùãKÐJÂgK_‚VÖu¶Dvcœ-} ZIXÏÙ•¿(ÕA4ÌϘ™”È®ü?@' cæÿ:IX×ažtcæÿ:ùZ}‡y*°¦Ã|A?E†ù/C1¿¬Å:ÌŠùe­ÎÃ<Ø Œq˜ÿ2“P×ê7ÌSùû€µæ[}%�q ǤÌUœ$¿½$ŒñèÈW —_Ñê|tä+è$_Ñb=:òèåW´úù úÈW´ZÙšš{:óŠÔºÓW¡›_Õb�÷ñUèæW5Éx²zúU4¡”1áÓÓ¯B7 ÷C[ï‘ÓS*ÿð äƒÊõ´� ü%2âÿ#4“0ÆÕÑ„fÖuu”tu-¶ÕÑ„fþ£¦ru”;Ÿ`�¢·§€Ð¦‘¶³!%ÿ^úŸ€x⮀òûVñöÒòÞÙ䊓ã?k~è­†z6i*’ ®Šfè–NDÉk€º¦Ê/ån¤F' pŸhg ýVÃt*¤Ìàÿ^[ÑOúF3}£¿Òîÿ­…þ¶ÎÿÑ-_?R ®"׸â唿Mfh9g­¸~úЊ‘šÏ¦SfÎJ½ahuñåÑÜË÷GOÝËÜ]}ù'³ôòÑÓ÷W’Ãîÿ2C³CÓÎÒòˆ1{ãychz.o¹ÿpdxôTòØ©ÔüÉä�Û/†–ŒÌ;z í�'-ÄâÜ— íà2\K5´¿L™úê—©[y)bæVõ\öþªÛÏFÆôTVÏdÝLY}°hd¢NY6^¸qíÚäõ0ÕcL“Ö_Ä@ ‚F¤ým}Åðôì¥ä†}ìkeÜÙ+úådÆ;¬ÌB±y63¯b&þx½õO·O —)aCðB7oÌL=›t�ôþÓ)þPSyavŒíìy)…ÆÞTNåùÚQ)UöŠ®ÛèvÝy‹ž#¿¢Ø°‘6 0ˆ'Ю×Äì멃úÍ´Ii’<ÝOe“^‚h?Õº•ѧ‡FŽ „´ïhwÂS�OIóç®F*þ4ƒxhȹط'§Ï‡Ð[«ùþ-aÈŨ‡§ábRäÞˆb×wBÞãPñ� âyT‡ øàNÈBµZêcwŒ´e„Eœ]‡Y§…%�«u¨ø] âQÔ:/d—Wu¯Yô¬J—R\R~¬9²OŽÈ©³õh%Â~Èý [̱œtXbr´±F;î£âÄ#Øb K'rýš @<’Õr¸¢_SøïL¿u½__1Òy(1)7áF´áaȇêOÞ6Âô'ð7h¡3Þ¸ôgƒßê,›ñrêÏfY:ý) quÖ Ñ:RNfMБ¦R™Ÿ™Çè±ò¥ª ]€O3°r‹2SÝîúÇcc%ëüŽÏB>«ÐÍ)®$n.ŸHm—ÏM´·{!÷ŠÒ¯øåVà8äq鎿#*÷Â4Ñxx ò%i:­†­çL'ŸËøópNR›|•ô°r«”rGßrUE-W#Ø �<�v7�h �Þ<ù �¦_ìƒ|LauD,›o �C>.?† Ôë ñ({ûˆŒÁML'9 ùdüŠA‘�ÞÄ A:ï`ÁxQaéåE×–uCO.9#é˜9d™÷ÒµzéÏóþ‘™”~ñüµÖFñÖ]+ƒg! Í%J÷[ÌÁ…A�“ÊÔÝéz ½~™ðjé.ÕR"ª‰£V2èK›�; «\XŽèü[Ü Y~a™ÿ„ }§r¢¸Ö¬ ÊЦ´ƒm¢f¤ÓcyƒL)Ë×M¥¸ob”„,<á¼×ŽOñ×!–]ÀnÈÝJFkúÅÀÈ=µï°mÌs¨ˆ’šzÜ·ûÉìÒr6ã:FÞÒ>�óùtzU%o¤ÉWJɌĴøäê3´û}ÁCõãÀ Û«ì䢹dèãzbiõ®ÿ‰~ÔžûGf ˆê‘#‘Þ …ÅV·hµ(ÖÏܺÊ=Ràˆ�‡‡ ™*þ‘bݸKX€nP‡¬+*èw{! /G?|�¥âÚ€}�ÅÖØO‡‹SLŒLªÊ8ÁÛÁ‰íaàs�Ÿ“f½}ÁZ13úŠ™›3k©_6¶ù=ÃÃí�·Kõ5ö[ÝÔÇ1ãÅ ;Lâ'ˆåàd!ƒÍ§uT\ð d1Í~Ê=NPñgÄ£èí7xãƒõư h)j†ÜZ&ßÈÔÌÛ¹!þz§â×2ˆ'n¨�k³ ¼Þ;»ÀI�96æ-»7úÈOÍ£´¶ŒÒ剌kv3Y#—3ViQÇ4\k—͹V›Œ®—oæ’Ùg×Ý0*¾íÙwÞúÞÅ'œ…<«Ü é×ì½±1þ[ø¯»ÿ»>n?…Ö=F€Ï@~&?eñ…"ßGàmš�C�‡”¸1Ì•síYÈÏÖ~@aÎ;zÁM…CÀ½OHÅ?Ï žZ›õÌÛ¿Y~ÖÌmO©ø; ≛F'j ÀÚ˜õµƒƒ¼ÚÁ„ ñ¾×裠Q¯°{7\w;§/9×tÌœ]ºOèþm1›²E8o…|´öÍäSðLíMðô…œ*QñÇÄ£èí›î¹ï¨~Ø�á�xí ˆE�ŽîF�`oZ/K‡&(?}±o]~ •{JEKˆg­²V#`T¤«´÷HªËFœñ²uÎvê‚Ê_Y;­›�~zR¤a ÄÓ0€ƒ�¥¦¹_·2+–íºè«ƒ¼�ˆ¨ Ï@š~‡–úØfÆSÑyI/÷ju5iT|ƒr&mƒ,�nÍŸ ˆG�Í¥C»Ì¢³”æd¦kþ0DȜٖpXªyT㋎³l� ¥­y3¹šL›ƒ¹�´57˜Í- 9ÇrÿbÙŽ±`Úƒô6ûÍûËfÎòîºE¾ZÄ5 z¥íÀ[�oÕìÕv^i€åOË[ž )³*ÞŽ3'å^Ð$€,4%¬ÃŽq¾ ü6ÈߦÐˉwG‚Þb x²ðqÿŠ_>| ä·(¬§ˆi?7|+ä·J÷†uî¸ÊÛ/‰Á·¿òwÈ3É»c7'“>t1B&‚âîÖÂ.âqw+⦠«\%ªÒ­šÇYæ¼qx§p˜µKI¢_Ü„,´€Å×�¨¸õÀ!ÈCÒj»“†ÏE-P¸;b5 ¼ Yè†�œƒÀÄ3PèÞ*u\Ùíìóù´nÍë«Ù¼~ÏÈx^¼ûUd&¥§³FÊ­QÿH—áxG¿lo¤¶j÷^…ðd¡Õ™R“õ4¿Ébb€ÕÐdmKÍMx“¥‡Øx¨Æ´8 y4õu¼’¿û6à~ÈBû¡¿¼ 89†#nT\±æ dù#nûõùÂÄšnbyÌw†Íû–í¸ãíkDð,ð%È/Imô,A?owcœp6n‹úîvÁ3]Ý�>ÂYÈ1E¿ îVÎ_€ý6`ä%Ý�~±8y¼öÝ�ŠÛ|òãÒZ<âu7o˜£ÞVßÜÏv'ÍÖü*ýyž&ëÎê²is_x!¾ç€Ë�—åG:bÈÉdÝ�°v#]kIÊî^Gäö‡ 9…ü½®e\&[nî…¼WI‡c\rÏ Ýäc­;„$; Yè`PI%wz.XF¦Î凌ãö ‰Öð du+œî¤LǰÒaçvzÐw†4•.9÷Ì€Šo`�`w¦Ö�›/¹µ�Ï™ú’«%¼˜H[›€�;D(zÔzdkŒht2ˆ'î†; � °Nú3‚¢G”ÒØ;5ïM ýqÔsYí~o<�Ëò/ß/½�…ŒjèPõ˜ïfGƨcFDæ ð0duá#í1× <ùˆt{­×< ¢Ð†<¬¬Y66EZæðäsñ´ÌQà�Ÿ�n™½px”‚§èùŒmòdž#NÀÛ�oKs[ëŽáœDŽû-í!ÈX‘Î4û]Y×E§& Ô8ŧ7TÜ:àÈBÑ>ÊnñS�&Ìl§nkfÌ{þß [OYóófÎÕ0^­"Æ;�OA~JšyK2›Î/e¼ £ü­P*ÂÈ-ÒœNÓ‹;ÿÎÑ"iΰl3uƫȜ;Sp‚qÎýÃÊØnM.™3ÅíΞcÂÓ�Å"ž³Ÿr;LÌw…NÁèDE%ê÷ÍŒwÝÝ›Ðr´�Á_ÿÒ“é¬û-^úLÍyK¤k4Á%Òú;ˆxfÅH[)=YˆIÊÝÄ ¡Â…ù­[J̓ æe7FcšÊàòk­y�“ÈN¨~ ¨ý/r| *MÀf­¸·Öã·ØYÞ¢ír{]†ò¨Ì™úr.›4½;D"‡+ˆW+°²PDƒª J;½8Æòñ‰åU`rRa#VYYÚN¯ r�xŸNAžå_ñËCÀäT<êÝ4!›Òê-r€‚Ì-È–4“}Ö¼?°åL;Ÿv½x+C­³™Û÷Œ÷rÖï2ç<%iöOahó.uØÞøKŽ‘JY4ÎéâD„—ñ8X†$[ªÛD‘6�­�[k¯ñ�£ /ü%°�{ŽÊo¶CnWÖ,‚Ë*D¦¸²ð:_›lvCî–n“ÇúEÖUˆƒ<Y(ª^xwqÌ¥ålΈLt_µiú�Ç!�§iz€' å–›Qñ'Ä#;Ùí-Žü“Ýs~ûz¨n²»3Ÿ±óË®ŽP@'ÿä�Оç`D(7—Óã†ë¼ L«^�À �….ó)ðÞ�p#ä� ì=o{PùMÀM�…‚Í”zµV†BEŽEÆ÷¸©�GµÊEÓb?í(¡æ/+Ù‘‰…¢¸1×NØPB²ÕVœ¤ëÁâ·+xt.*­6nÓ8‰¢^. -•² '#®˜ £´K²%ËUßÀ ž¸i\F (^Õö‚·M„L 8™>©ù懰 ²Ð)f�a‹lÅ �A5OÇ( ‰ª‹9çHý|ÖÜ“µ» �,¶ûS«mÅ»è „!_¬½!¡âú�“�…v3Ë®:Þ³Òi=•-$t�Ûv§KÀ Ë'ÉÙºlæ�e[Ÿ[-\Wâ$ö ÐvBèƒà"f˜6í«¼A—”úõûú¸×¸u‹xîŽAŽ! · xF+äŒÛ¡âÏ2(œ3PÌLPBufr�Ž{ùþ]ÚzN6k0¸²ÜJV-¯ýËIàÈÂqGëpí‡xÏC>/Ê¿â—{�/B~±öÝœŠK_‚ü’´‚ïs�8})›+Œ䓦²îÔ³Äë.ð>äûʪ¥ÚªàK~7Ðæ´ºNà¨øñÄM#‰°~óÈJ'T?�¬š>4rŒ&.›€­�[kßy©¸õÀ-�·H7Jwq"¬×²±[y5‡ÈµiÅ»ŒmšŠÀ²'½+²†;‘œ³ÍÂá-œ-þ3ˆÑˆiÿígúExòIeº&&ƒ8�§ -óéw x²P¤¯Òí"îur*ÿ)àUÈW¥y ’AÊæRf®\¥RYÓöÎÇ.Žã~,rE{*D8yðQ'úõÀ ȵW'ú‡CÀó�…*Iu¢_º¼Yh/7Ì.@+T3Ì6N ç^B5ÑaÙo‰Ÿ™$>-ÀÈB|ªJÅmî€,1¤¹dÙV …v@> ¬…„Ò>•#ÀAÈB6Ž¿q‡ Ë{ûÙPÏp#00xáÖ3QÎBž•¦ºÝ[´s}µ [9&PË×Õ]d»ìÅ·/¨9�¤™CŽîgr)/+EÌac†[¯òõU“?AÎð„r þì§Ü&ýe`]MzÕ›tÁÓ¬D¦ˆ{db+²|&ƒŠÛÜy[}íyýŽpduÇÒ„ì9Qé�,´ùÂß8 `?d±c¤ì§úýe×ì=?þK…m7rÜæœoB¾)ÍôðrδÍÜŠ™ê/D,D ¤;K~Wˆm·äk†‡êÎK M•[o2ñãݯ[^HzqôùIg@”p²üðÎm˳(:ÀºÚòe ¬�{.|Ƙø´ctÏ©¸ ÀGÄ='*;��ˆ{NTŽctÏ©¸ƒ@uîy¢Ÿ±9–ï/+†•öÿàxÞNü†�· ß’æ9b›Él† WéÙt—ñB6ãšòyZPÊ™ÁÇ™nûøŠ¯Ž@‘æÝ{=ë�É)\Ü-œÛqX�ž›m ™œ�’lÏO¸u¸�O¹~ïQÁ€dŲ­@5ôŠFá>ã`ƒ;áyÈç¥ßc¯ÇÎÿ ΉG¼÷BÞ+¯¤¿•zKû×A¬c:ÖÅ­y0Ì+Õ îq~E¨fœræÖUýesõ^6çv¥¤ë}ºÓõ<�ћϙfz•Ô²x`Êî×K"0{&ƒ*–»Rïá ƒÓÕOJ¿ÍMo'Ýc¹´d¸h/É€gÖÕ‚œ�ÞHÓL?g$]e!’\ôNý›÷ÒVÆ´}çÖ˜ã?œxoBxòMùÎGÍâÅ ÚÆÊTš›ã*x­*í|£n�õË%…ÄÞ0ÍvÙñI«pÔ�¿ŠßÊ„£�G¥éû!—¼�Eeç¥ö&Ð!T·RÕnxB±×q÷µoÂvÈíñ°WQt€j Ø‰ÒØ1Řt…�âbÀ:ÃÑÓ¦aóçHø&Ð%<Y>Î`——ô„N\)ô :pµ*´�÷Í EعKʯóïÛqæjÚ¥,–¾‹ø�Á–…öH#œý*§­ZýÓVîÌOC ÀúË€× _«ýˆŠÛ ¼ùº´V7pŸ‚§òooB¾)¬ºc²vê[4ÿä{€1Ÿ‚ÿVÍ$êŽwnt}Ç\0¹#_+ƒ-�[â«�7£Þ¬¸62î,Q JÕ›”« öÓö^òš ›Nóü¹sþ ª†Pnˆ³úk§2óQ µ¨CL:�»!﮽M£â¶÷@Þ#Ý@B9°ˆBpdu'k¯×EÚ¤x²Ð2;›$€G ËGJÛ¬®!2š™â¾ÞO„ú��k…ÖqÙ¶oó›ÕC•¶-�] G’·6¾�Á:Xú· Þ¢´6¸£¤¼¥ ñ(굑©‰H3°²P³ðuZ*®تI$@(SNÃÖ¯?}õ*¯r¾ß#Ü Y<`8·r¾ ùV¥ÊÙ¡Ÿ<>0g9Ab�Þ¼-pyì­ î†,4Ò†jì†ÄœµàúŽ ^½%: `ä¾Úë-·x²üVò~ïÊr!Éwßöª”¿jÊ«ÑDððd¡IŸ×ldg=ß®ù3�cžõ¼ �êmJ;Ø1Ú¥X1½Å'K¹u|·¿_¿·h%õ%cU§4r´³‘´l‘½Œ·1x²XZ>¡z{;êêíJëí,SoFq©\_1“N6ÔÞ‚µâ]’7õù<]Îu«p‰ßíx;ƒ�…y—®õäLï´JÆñ‡ð’úT%a+d±ÑO¨Uß�"ß¡¸7à ¦×2þ~ιÓoÒX0¬L1K%o½½ƒA©ÞZjµ«qߎjúN`�®ÆQñ â‰Kq¾ oþ]Jgcz]õðu?={ià4oõ|ƒÝ�»¥ùí õ͸}ÅÔÍŒë¸^”ÝÇmÊ¿F¨.ýf'öȳ3—–�U„œàÞ^úP"ì„Ü)MïÀœ9Owb‹›ç~:–*/Ó v„ ‹Ÿ1âîïD‘ïTÚ úôyƒF?½w9kÓ‘�U×b:ù\Æ�gSè!Ü«ïdpò`|µõ½¨¡ïUZ[mALïj‚ë2뜵ò½ v@îP6«išKgçÆÆèÿ ðê…|Tá´¦ÊþÕF�´ ç.àAÈE9Wüòà䑸G]*þƒx$it÷ZóÌîñÜjÉáî~þ}è\„Ý�ÅÆ>¡~þý(’P]?Œêƒ{îûý n‚,Ÿn¬z{�á%ù¨¤�n/öÓÍì ÁÉèÁ‚p3äÍÊl⺋ÿ½G¢²ØYÈLó­òPqÍÀ�å]µµü>#Ø Üy—üL­p‰zEΣ}AwÖvtôÔ°îŠGG‡=ô=¶‘ácÜžøA�A3™BÖè‡Q$¡JkäXü—˜ÁGÖý*‰P�5êa­Qà±ya­Ì¢™³}>—]Ò9¹þ(øö@îQf§6¤¬ùyjg^[Et€Ç!¯½­¢âO@–?<ÆÌœÊ? <ùT|=þÇ „êzü&¯ÇÛŽ±´Ì[?ÆàÈ[µnÿã¨)ÂGà ù ° Tï„4Þ¼13õlÒáíÛÄf+°²Ðâ_ߦâš�» ËÿÜó*~7ƒx$iœÍ™t¶Â¿DAwšÜž¦¿‘nQ’::z‘1) ¯‘³Ò«:.‡â˼oðï I„g!‹ÅTd?m·2Ë.Õq~ÿî߃ a;ävi^§‹ÇÍëU'ï'Á˜ð4d±Í©zéÅO�õO)Õ‹¶r½à¥õ@…° r›2sSmŸã[PÚOë´ÏAÅ70ˆ'nÿ5 šÚ8~ͺï_qón]ø× pçÆ ±R¸¼Wè¹/eü'°%<YÈ•«ÀÿŒ¢®ÀEŽÎ©ñJû™ú*òÏ@y¬“"ÿÔ@€âµAžÏ¦‡¥éOý¬ÿ+Ä£ÈËû&×GîÍ™¯ä­œy�î4Ñ5½ÞÄôÌ­«®åKôëî'¦ã~ܸ>½§G¯üzÆÈd Ž^ùú¼;4y'뎪§÷Mú~ݼï³iÓžšç­ŒÿŠ |;ä·+ë$爐Ç^ÌÞ‹(z �9”P+õ¬Zï`�$�ád6£ŸÐSsüûº½P�±1{ûúõÄØ’¹”Í­Ž%"‡éHÚÿ UF8 y¸Õ÷s(;@5Æîveš·BÝ[r’FÎv»E¡‹Œ�öÝÂÝuÿ¿±z×vr¦±Ôëû…£c'úõûø+ù¿ã…oC¾-ýr»Ù[f%¯ÅÏðçÁŠp7dùù¿üÊP�´§æ.Z6n¼SUñWÐ/‚ ¡Ü4'ÌÜ·¾Ú'eIóm.á.ÈB³l~ûûK¨Œ_ª³æPù{Ä£¬ ‚ƉpèµY©Òr{HT|ƒâŽš’[‚¿¢ùgd?/Ë~Ú}Ã;”wñüÔ…b\–3C‡Ví1�—䯢¹»!wKuëÐl5%t’iö9‰þšæ¯�ýˆ6‹ ïUÌ©ŠŠb�:d]a±«†¿†¦ ÜyŸ´î4p/nQù à~Èû…Õ£!B=šSs^`8‘K׿e 섬r]7B1~Ê@¸ ²üºn'"°¸²:»©¡¿­$ì‚ÜU ¥ò÷»!‹°( m/ÑPÏ‘æäù.¨æ»À±Y ªÂ§¦ï‚j¾ ÕÓ(\=’jJtà>ÈB�OMßÕ$L@NÔAM©üýÀ�żV1¤¼X•"†ôÝÐJ 黡•„u5¤D`70FCúnh%a= )•¿XSCÊh¨ˆ!}Tó=Z¬†ô=PÍ÷hu6¤D@ÆhHßÕ$¬§!¥ò÷kgH›Rs ǘ]]æµ¢¿•$ì€ÜQ{õü ¨$áÈòÇÔ“ìvBV9ŠD¨ço@% wAV0Šp«'•¿(5ˆTUÏÍìz'Ã÷B)ß‹ÆiÖïÉó)è{¡”ï…^4Šê…¬‚¾ò^´Î.-–°3ï…R¾бFX1ä”Êïî…,4|VUÐ�©¹Éûf2y\<ŠÞoB# ·CŠ�ȧ�¿ �$ì€,dµeµ“ì²wFhçoB# ;!+è�ÜÚIåïJuÎM“&)H±-2Mz´ò}Z¬Ó¤÷A+ß§Õyšô>4 aŒÓ¤÷A+ ë9M¢ò÷»µZM“ZRs—Mgò~Ò\.ŽyhŽï‡Z¾_“©ü.`íÌg³¯ 7ü˜œ? ­ü°ë*臡•Öê¼ úah懵XWA? ­ü°VßUÐC3 »µZ­‚BC§½ ʼú´òµx5ô5håkõÖÐ× •¯Å«¡¯A+_«³†¾­|­¦ŠAÞÛGâUÐ�@) cä?¥üˆVçAþ#è!Ñbä?¥üˆVßAþ#è Ñj9È·¥æ¼Œ—S…„Šœ4? Íü((6kj÷R"´ô£ÐÌ�¢v…kGRK‰@7P×$6Sø´ô£ÐLÂz^¡òÀÚ]Ù$žsïw¡“„Rqþøôów¡“„;!‹e‘ÔO"Ð ÜYå^o„~þ.t’PÝ­G~ý¤ò÷¥¶z«êçF?EÖë?Åü6kj}±%ýóc¨œFáÊ‘TR"°(åŒñ)éÇ ˜„:d½JJåï& 'j1[š6—²+B—?~ZIãlé÷ •„u�-�ÝÀgK¿­$¬çl‰Êß ”ê ægÌLJdWþãÐI‡ù�C' ë:Ì�N`ŒÃüÇ¡“×ê;ÌSù{€5æ ú)2ÌŠù -ÖaþPÌOhuæ‰À^`ŒÃü' ˜„ºV¿ažÊ߬Ý0ßê+éŒc8æ’;©ç$ù:ô’0Æ£#¯C/_×ê|täut’×µX�޼½|]«ïÑ‘×ÑG^×jytdkjîéÌ+RëNŸ„n~R‹5ÞÇ'¡›ŸÔ$ã}Èêé'Ñ@„RÆ„OO? Ý$ÜYl½GNO©üÀƒ�…ÒzúþJrØýßBfhvhÚYZ1foJ²Ù¨Cøù0yý؆”äÓ¤ªÎM(X(h.m:IBízyŸã&Ö2„í�Û¥‰mÑ)mÚ¼uße•8—à§Õ *­…ࡼz»6‰Ÿ Ã@¡z·º•d8Ž™ËP-%¸Yµ�I[i}I²ŠÎËI„ÑvЍÌÈÛÆB˜4¼E&šÛÀND_ßs¶ËÒ¡YçfñÒ ^¬Ü›\›äŽû´MF¸²�Q%Ô1QHR«' kóƒ7÷AÞ§L•#s 3Sö°ðµqi2¿ŸAض™Ò³š® Pm†|Xj6q–¢ìOä^m5¢O_„ü¢Â>WܪÞüµrj\ö‘>|ò“¢ä+~ù(ð%È/)¬–ˆl*îð.ä»ò¾Î ~ËhëFÎãµDæ€Èa]Þ&k hÂÕÄ`Yî$N:ïhÑé÷C™¥+É&:¥zrÑÈIÊÖl;9Ê KY(½´±yÿÀTJ¿xþÚ k£x뮓Á³�ÏJ“_o. êœT˜@^’õzz'áÕÒ]ª¥¯KM”6w@Z­åëü»ÜYTvÙ)·’0gÈÃΓ׺ƒ1gÉv°MÔÁŒtZ`,ßÍà­0)U<–¯›JqÞÄ(<ù BE­2x¯Ÿâ ­D,»€Ý�»•ŒÖô‹;€=�{jßa©¸6à!ȇ¤5õ¸o÷“´a�q#›T–F�ù|:½ª¿’7Òä+¥dÆbÜ |ò õ˜ƒz5Ý^e'Í%ƒ–y–Vïúÿ‘Àò9ý‘(¢ú_äHA¤7G!�Ö^ñö08y,þ©"†Avˆ/Ùaâ÷8A,÷Ç´‚᮵ÖQqÀ3�Å 4û)÷8AÅŸe�¢·ßà�ÖÃ* Øœí /fò�L;˜b 7Ä_ïTüZñÄMCG X›åÇüÝaNn´ÍШ·5ÁýšÐ%åÇým}>çš�Aý’‘t²9Û5Ú®{1ç픸F�̶ëkWVLïkƒ¼õLïÐ ¼ ùªtsºPN¬Àß´“ƲËÞ„8É& „‡ ‹Í�ªùJ­XažñÔ¸½&"w8 y:¯©e¼„ºñãÀ ÈJü'úÅAà ä™Ú�dT\/pò¬¼)ãÝ¡¤âŸfO­Ç“}Lg¹ ùvü†œŠ†Ab™ú€V쪗!_Žß¦QñO2ˆ'nƒ¨�k³L½vp�W;hžÐܨ©¾ v䆷>mä¼ð8¶ž·ýøQV&e­X©¼‘Ö—Lg1›²Eˆož„|²öj=„Æ#<YhJ#§OTüiñÄMc5`�vóý̜܎B›�j*vóË9õÝ4hŸ&X¸_펕®vëó®·³œ6’æ¢V‹W¯‰n+ðd•sæ½>ŠÖ;ªÅì¡ÚÛ�2ˆ'n#¨�k£×�¸tÎIî”™°²ÐÒjpOºÔd3Š�;ñšÍ}wì¾G8Yì¤2ß$ÛÈ´“ÑÄ`ÌwÇN@¯Õ�X^£sÖ‰2Ä£ÈaoH$x½õPkÂÈ1,ñž@O"lÕ$vêKÞ¿yLÏdƒŽÄ« 'ð=Â=�Åg»Ü zJy²¾ z² Õ*èÚÄQn = ­< UiU> = ­<‰Ðè£d{lÓ—³¶E7‚yõ“ˆ´™ëOqé'ã~+ÔÏݺ‘YuimØLÛæ˜>O‰Ù…NÌŸbP‡¬+Ó“jG��kNÎák‘cL± �â÷Þ¨øµ u-µéNa:Rö6¼ö¨lÍËUÁ(Z Àá– ®Ù"KgÌÿ‘âQd÷”EÄëã5ètœ¦Q+^‹hÔƒòô3ÐÂà–€X PöÓA? ¾á˜6�°q YÚÔgn] v¼œEÃAÀI÷ ¼-I\w'!Ë/jî/žŒGüËŒnÞ·lÇ#ìPÖ9‰žE…†$(‘T¹¨è�ܪGô' Î~xÕ£â‚]ç!Ÿ—÷%ŠªÇ«WDäðäkÒ„öºƒ¦Ñí¼å_~£y,ÍgEn*ŒC“ƒƒØû¤´*L»6¤æÎ[þÄêðqÈ�+T¦*WÇ}ÎŒ�Ç!e\ñ˽Às�ÏÕ¾cQq à�Ÿ�Öãî-e*x²|¢°XÁV7î)Œ�>q}fÊdFG½-Þ´ednÒ�£GA’&=æ’v»;Kw)k;éU²óù´ghƒÚµæºår÷Òå™—®Î�3áä:\ÅE¨ÆÕª³�§M*z™A<Šzìæ;)ÓNæ,/öU„‹º�E¸Òèåéhä+†(50(ç̯—¥CCsƒâ릥¥¹¦…“ÉEÔ2á:Èë”ùx¼ôéÔŸM@,UÖzì¹è·®‡Û o“n˜“…í[})o;t×ÁÍû®�OZdI­ŒžÍ¥è(«ë»¯d­¯RçíÀ+�å�ô_1Jé÷Œ\†nè:;’îà.™÷ÅÜ·1trszÎôÒ¼p“PÇI¼ÏÑ÷‰XûI™Ža¥ÃV . ´KšJëÏm%¨øåŒÖƇ¥Ù'/£ˆG²ZŽ”-=�ÔÛׯ'¬œe'úõEÓHõ’ÜÇÌùI4!sB°V Éc e¨F¡†¢jnÉI¹BÝùÿ%P{L§SèKžçb]šˆÁ;»Æÿ"O�­S2̪iO·•©Ó¿Ò´§ÿûÍ?Ö2ú«Ëejø(§=½�3 d¹ýzÚÓ@µÏ«<íéÇ=Ÿ‡I{ZÒü�¢¬ C|AæB©MGÄ#@#*�&SOQÜÄR›><·ˆõ%±Ô¦qµÌR›ÖµeÈbWIm*Ù2©Mãj*¾JjSɦé©È›™ôÊ;æ@“¡¤™ëµbªÓÈB–2¢É¢’f2GÖØëAq7?Ä Á&k�ž²?¦s˜†$ͬ–§J{uIÒLï€_HÒL:9�Í®¦aò+˜G“ÉSÇ.æ(S°¨¤l�äñ,›þÆ¥`|µ(`Ùô—SÁÚeéÐg›,KÊÆ¯ïª’²5AEš´Ð›xO¬†IÙšPa„û´Š¤lÒŽGĹÒ&h/ar"~M¦â÷3X–”-.lŠW¹~­<)sÏ.,)§¯+£¤4)QlÖ*’² ¸*5JÊFŸ¾¨U$e“îs5MÊF¤OC’²ñ‘¯øå£À—´Š¤lÒÕ±ÇNÅÞÕ*’² ÚɤlD怭")§.—/‚q(Â&ˈpÒÑxG‹¿zr/D°‰bJÊÖÂ`HR6AòBÉxZQw­Òõ¨<)[+”�0$)[­:+ƒ!IÙ‡?)•ß Ü¥U$e«uÛeØ¢´ƒIäÚÙ #+ËE’²ÑwÀ�¤lµ¼’²Ñwº€ÝZER6‰Ñ𾽨£U$e«U‡¥/µC’² jjIÙè;½À�¤lqŽm~_ðPý8Pã¤lDz3pT«HÊV+Åkcp ò˜tóq{bTüË’²Õz h‡¶´Kkû©Ä@ÑÎà­V…PR6¢´’”­–#…HR6¢ÙÔµŠ¤lCýâ`HR¶ZõØvtÂ>­")› ®Ö:)±= |N«HÊ&ÈZIR6ô åv ãHʆôŽiIÙj¥uT\0$)[\ã–Á²¤l’o_-RApz)¸7/¼˜É72mfŠm€Ü½Sñk,‹T ¦{Ê5Bõ0nþF'7ê¸�Æ�sI¹¡Äë¤_Ü | ²ºMúÈñ¿úLxòUi�æ¿.Nå_^‡|]šÇîK^ì$¯»{=,ŸAã&ÈÄÖ÷bM­ÑJbMÅeM™¢ZÓA65hqªXk …#Èy çÂË™ ”.yШšiÚœš»è¾Ã¬ËZ(!ù.àAÈ1­’n/ò`ݬ³ˆ7k›¿Üì�Ãji”ƒ0$ «h¨×^ñÔzJÐÁ¼}dùn CÅfOÜ4ö¢¬Í”@8¯f7za«V­“sV (¯&‘i†äÕ”\ñÊÓÍ< ­"¯f­, Ó É«)¼Q*Ò"€µŠ¼š’-"–�‚¸ô‡µŠ¼šµl’àQ­"¯f¬M2 É«)Ù$IʈÈ0$¯f-Ûã80$¯¦`{ÈåÕ$.ãÀ+ZE^͸ÆÝoتq²2 îCá„!ëaЉJpú–9gUkm¥âÖ[ ·H7I¬y5‰z+0$¯f|Z•€&%j¢UbƒRB+ž®nÑ*òjÖJ­P¥„šWS°MTçÕLà{„C�‡ê9d‘“À�¼šµl­a`H^MÁÖ’É«ILF�µŠ¼š‚ŒjšW“‰E%®1öŠPÍ«.¯æAp –ƒ°öWÏ¡—¨ìÓŠ‰}ZI^ÍZõ:*¹4Ãòj ¶”ò¼šD­xI«È«)êÏJåÕì�â¶@–÷Z¸û›H[]_S™W“Mö’WS¶·‰äÕ$*û�=ZE^ÍZõ6vá1$¯¦`[ÉçÕdBÃòjÖÅi$O/B}ù›h 8©UäÕŒk™šŠ¿Ä eo±LÝ­»jH^͸lÿ$ƒey5ã¢Á,ÔKšÖªËÔ…«àœôhñ¾تÉ.S¯•Ÿ{g ·AŠ¢6]y�7|/ä½µ·"TÜv`7äniNôûÁdƒ-[Ý`Âø‰,ZL× ‰!#‹rJÌI“¼Ä+â$9„æ" ü@±1+ôÏ…éɉÙI}vâüÕ¨Q<*î1êJí.FtgºŠQ¬�<"Ýj;h6½dd\«Æ†‰çU)"u 8yJšÜ>ßàÒ„RMÒ•a(!³á%IóÔì¢Ë°ÈµFWŽ‚0aíùŠP�MÕª³�§My™Á²Œ+’½öAWQQÇe*�¾¡>ã Qj`Pnp’θBG�›¨QZÆ•“¨eB&æ ¢H<ã ñÙ ɸR«IäI¿u=ܦUd\l˜x2®çíÀ+ZEÆAîõ˸¦¾YÝņjWN ´ˆl»q BAÖÝåŒVãÃ҉쓣臖e\¬–‰²HŽÅä«ÞK¢_OözÁÈã^0sîæ¼0æ}'!�Id MJ8Yh¦ä=úâ=Ä’o°ie™õÑZ©cÕÔ¦kTÓ-&÷ëçW;ÒÏìÇùwÏ2îœ�îLxLj ç†üEÜï2þ„Lj'ÉwŽÔ�ÒD/ôëGÇN¼È¯ �ƒ*á°Vðó%i_࣭$�È9°' 2\ -†[5�È(Š{B© eul`Pؼ‡~«z¦ŠÀìi"¯æ¢Óß¾ž©¢zþ‚¯gªð¯ª™*þxýñóÒ[ËÔP8S…Uû–¦Ëf_OQès®L²Šk�¯ÅߢTüuñ¶hƒô÷1­j² ÁjéCo÷³TxqS*³SH§¢Y�VÁTq©ÏRQpªÏfY:µª©(øµ9¦TO¬~©(¤Ý ±Tqi2_%E\4�ŠB‘¯÷L 'µ¤¢�ÔáÍlÄf-ÀNÈ�µ×Ü äaÈ�š¸T†ŠßÍ ž¸ikQÖFs…ã[´@c [µŠƒÃœÚ«(¾‘i†Ä·�ô§…•n`B«ˆo!Ý—"ö}Ñe= ‰o!¨ÄüÁ¨üÀ�ø’-"v+„¸ô‡µŠøµl’`È ´X›dßB²I. ‘1`H|‹Z¶Çq­˜È¤,¾…`{ÈÅ· .ãÀ�øq�=­~ÃPÍlHà6ÈN‰ �¾ÔlÖ*â[ÔJ[éKÁ2Q dùUÄXã[l�F†Ä·ˆO«Ú Im5Ñ*±A© ªÔ¦…Æ·¨•ZµA•Ú´Ðø‚m¢:¾E¾G8y¨žC9 ‰oQËֆķl-™øÄdßB�QMã[´û*à!³»÷ËfP7ƪ‹o± œåfãʆ^¢²ߢV½ŽŠÛ ‰o!ØRÊã[½à%­"¾…¨?+ß‚�ÛßYÞkáîk(:@5}Me| 6~H| ÙÞ&ß‚¨ì× ™ÐÊã[Ôª·Qq]À�ø‚m%ßY~<Õ*â[ÔÅi$.OCâ[Ô²‰Æ€!ñ-D{5ï ‰A<ÊÞþÙ[©Ø�øqÙ4*þIËâ[ÄEƒÍyQ»ej�‹ç´âÙܨ©Þ"¬áÅs"켜Ô*.ž×J­;Ñx„!ãÒ'*þ4ƒeÏ%ßþá.žîn�ìBG�`—Ú(K‡ÜÝñHÖÊïú­û†ŠÄJwq�EÃq½)3—tçÓzvî î<ÏöÏ-ùS>»äèïû°Ù&B®a ¾ÏdñåÒ Îø÷³³yg9�;e+hÅÐ]/Ñ!þ¹ìRáų¼¯Òú„!—>_å2ø¤Ìe3C›ÝY¸~oÑô,½Ü’ae‚c)sÅJšÔ�Îb.›_X¤Åo÷ߤ¹ç/{ñ„êÆÕA:ˆ)±ë®/¹S‹,´1÷F×p¿’w�ŒOÝàI8yPšsLWÓu&¬£Å߇¢Tcuµê,äi'4ßß�¢�êAWÓƒô>A°V¡J£o¨¿šN””¾ÖÉÒ¡…¢&Ë®¦ ª×6ö®°ßSÇD’®2«m‚Õ,[Q=¨œÅ+Šèh¼þ'ƒ”9Ì+ÙNºŽCж>oø¾ƒ;BÖ�m‘H©,¶c\•ĆAUWI�º—ôΦÅHŒ•¶PŽÁ^÷j…a]b�¤F9‰à9à-È·αjšc�Hž…,tp!ô—§!O+¬–*ñR»�3�gâwD¨øYñÄÕ·û|U÷P]ßî)@êÝþn¾ge:zƒG ËÝï ëè[ÐS®º5–3ÒܽœØMŸ…ül<½¼u¼”»óÓÀK�…—6+~yøäçjßÅ©¸~àó�Ÿ�¿‹Sñ/0ˆ'®.ÎÆ,U×ÅwèÓærÚ å’ë~w¦ý‘H¦îÑ k%Š4£ZŠõTEDðÒ¸”ƒ½°*5q‰¨€èø<ðÒÁÅõ:U@?^:@¹™[y&sþËkþ¯°,>�ä–Û5k^ïÍÑž`ÎôRl/»]¨71=s‹lv¢_w?1iÝe\§Ã }}^ךÈ;Ùewàtzߤï׃ Só¼ï6ˆ÷!|²º±iã�T6ãØ‹Ù{Ec¡ÊÖh‚C€dóRùÏ3ˆG’Çp2›ÑÏ詹 þÕ­^´èؘ�^ ˜±%s)›[Kð_QB•C®Cõ1e+4�%W;M#Õëy⯧£àDØ ¹SšßîJ~~,†#`E’²;¶–<†²TÓ’í©¹‹–�û‹T]ütdÛ!·+3À­¯öI™PŠj· ¸ ²Ð 5~Ô;QgÍ¡ò÷0ˆGYT :�<©Ti¹}*¾�A)§­â[ÕƒN›&šÈ«Ó7þE�Š;QÕhS;Êôè_s´©oxO™þ G›Š!®Øí].géìù׃NªÅK/:õº˜]=ú0A§JÚ‚¿S4€5!ãüI2Š=5 aNKKi=Eq{ˆTÛ oá±îô!¨˜#Ùq· ßÁ žG¢eØHTÛ! UQh©‰ª²X�H5 ¿ƒA<Šš¦Ƙ7½�à…æñ£áXBNù;œÌÙ€SÇ SØppŠ™'ÅÝpTü ñ6\ƒôŒä1­jÀ)Áj)�h6ëÎþÝ?za¦Üÿ—Ê:w*mÙN¯ÀJvjò�B% ;—= ì§m”¥CŸU ;ůӡG¸×‘q2cãN12?3�ÑceŒ&t>ÍZá¶°'·(3Ûí®<6æþ¿ … XüŽCŽ*Hû;Uv`·�—H¦ ›7È ÑÞì…Ü+J¿â—[�ã�Ç¥;þFœ–î‰Öõ8ðäKÒtZ [Ï™N>—ñ'áœ¤ØØ]­�[¥”;LÉ77 úöG Í4øµ»i¼@[€ôàAÈ•è4ýbðdužXäÑ‚Mø"áqÈ ±A�zeW¤…±ˆ·@¸¿ ·–dãö ¨øS ≛BNΟªzÍu<9‰"Þ´¿Œ¢•ÜFãtšÊ�L0ó' Yéå4¢Ë&Ý“ñ|1³/î»ͨTÂqÈòãÕÄí?/�”í9Ç?ÁbÐ� Û[žZ2r/»SÄ”žtç‰s¦+®ÒìÑJéÓ"ñ•Ö' OH¿Æ°U8ÊÙ¯[ƒæ n9!/”6 [‘åkÇ ~a;Î’^^¤¥‹œ-µ¢ƒ(ÜÙù =wxòiéÆkï÷tkŽî’Q,“;Oñ^�|Eš×¶¹Õ‚Îôë)kÁr¸£ l�²†Ü0ˆ]qèK», ­Y+Å¡/mî�¼Gº�Ö ôdúNP‡¬«k�»Qt"=é;‡Ä£¬="’âÒ—ö{! M«ä<6úNƒxjí±û½ôeæ@hÜ®}çƒe):â¢Ñ†°6[Sq•�“_»æ;kíø~£�‚ŽÛ¶2^›oû«à½óü¶¤¿I¸ò^e¶¤JÄ…HóNLƒ R*ÍI„y§âº�ÌUIMnëó#yÒ’²pûôG!�*kŸõÕ”¹j = SˆŒl¡†ÈuþjMr xòei{KçVØÒ ËÆ…Û Y¬[³Ÿî¸^H<‰#Ï) «Ç«ÓlP8&d•*›=¯®n/P‡¬×^£©¸�Z1$ÝN­$¹ƒ`+5ÑÛ‹± Ð0 àÈb£y¨±9—‰Î"PµiF€'! -Mñ7M?ðdù¥¨]º½šqŒû^øï¶Í¢ ‰»ƒ¯ÓÀ[�oIóë™ðb‹xÞD�»zÞʹc—i'�e·»‹Üócã÷õ@î‘R«ZÜó#v�3�g*ZíîùãcÀ ÈBëQ¡¿<œ…<[ûÎGÅ> ùiiånÔ—s¤"qxòi2gJ†{Z tÿ°œsu éèÆ‚aeÜNG˱Væ þÞ£n8Ž‘|™ßTt Ë2I³%_`ûD!jYÒËê*²9Ǭ”;RVÍ2¬wë‘Û°‘û!÷+Tý*æ`ݸKX€nx²š ¹ ˜(ád¡£¤|6`4–pò ´ÖŠ,·ƒ!àäåJª œš�ÍxTV>‘>¼ ù¦2ÎCž�G�� /H+p»;óò#§e’‹FfÁLñ.XŸEà*äU…Õ±`Ù®Mý!¿Qº:„ž¾‰A<ŠÞþá"CFD9�« ¨øñÚ³�²t:5ÿÈ`€jÎz®›åŸþ2ê5æDu×%˜ ‰ÞŠÿ&­$ML­L·Ø¹EºIöxWý)$­N`¢éE¯hªVàaÈbÛª–­‰ÉQà1È1œ[¢âŽ�C–?·´ÞÛÍh“àí(äz/U—'€1.USqc@uKÕtÛ»! øðäkÒlšÌ¥93•r‘XÀ¸ëÌ&šUÔ(�Ýaò¨VŒ4TV»·Nã/ßÀ ÜøÛ!K‡N´0ˆG²V®L$“æ2Å ƒÕDZ2Ïø³+ŸÞR¨?øghü³¾vaïC&pHdfÑ•ÛòQKXû»Á©[ M‰#Èï4ù;óî¤À¿‹iëI#çúu²n¸3/p[v^·¼(ØËyG,f›Æ„§!‹ŸªåZ.±» 4!Ç4–\Ë%Æ“Àȫп|89†i07 \€,? æ¶rTü"ƒx$i®Ù¢í>ô-Â:žïI èÕ ™§o²äÚËf’Ž°Ç”Í˜d®œ{Yì™™6wlä ®5¡¼±j‘­L ÐÖ¤E‘椣EöĈ6RtHÜ@Q•Ò9ká`âQ4MXs.ŠNÄéE¢ÑÌ ef1âô"×lÑ YÐ%#1¦›FÒí<Éd>—33I¯‘'åzVFšú”@kµ‡µÂéñz¶Ö)U¯ÒZG�ê�ï"?-çGÝLçû=÷’ײ¯Q­jÙ“§ã³,=~ÓzXGËÒS†j-ËcÞñ•£QuµAdš�í�ÛkïvQq�À­�·J7 žx*p;d¹ÞÊ6i“=À}�…Î]ñ·I09!Ý&Ã^ô‚±`^J‡ó¬Óu=m/ÝfŠÉ/FgQym ±EÖF϶ì×Dm ûé1Ÿ�‹í÷¦Õ™ÂÑB/ šëX/N’�r‹dYXd‚#*jåj¡ˆ ´ ÑB�š¨øñÄM£5 šÚh¼fݧ%N2lðl&^G½ü¢Ñ ðâŸ?CÅmЊ['4ÑKñ%ʼnìÆ÷·AVw»LìÌ)qÙ ì†Ü]ûñ�ŠÛÔ!ëÒ­²£0öået3—HxN¤‚ňS�åÄ^¥eËL~iŽÒ`ºÊƒ|íóÁhfç——Ó´&à]„MfÝI�½œÍ2ä±+ɼoŠ'¼ ùªômõ†/+ãÑó–¾¹«š‰Éä�Ûn èÕØm­: yÚƒš-#@<Š:ïƒRªu¡¢†d*�¾¡>¥Qj`PܨvI®õ<² yg1›ã½)7¬ùëb„;!ï!é‘Û [gDc7ƒÂw�åh…¨¦+>55¯¯fóžÓ]ÈI>"éù!½•‰L630q}fÊÛM¢/åòiÚ²sàP:ÍûB#x § ?%ýBÝÓŸ:ÞF7‚ ˜wïØˆêÝ�…Ü€ê?íWÒ7�œmÂXpowÁ'€Ó�…¦hþJÕƒŸôÈ÷Ç!�‹’¯øåà d•7:"Ü8*NÎBº4QRÑ̓ú%ÃJçݾʟ◨< 4 Ò”®¥²º�ÕSY×Qó¢aß_ÎÚ¦gRÜ>ºÖ¯Ï)Œ{s®ÝI¯öé®K—O;¼¯t’ðdùC-§-øÇ¶¿ü@†®àƒ’ƒÊ\ÑLãp»x'À˜Pjg*bmÂfíUŒhTÚIMåP¢:â~\4˜ŒÅ’µA¦}ßÃÒ‰œy’.lb°,Y‘`µô»6š²Ù$f&¯N^˜Õë—¦o\ÓŸÕŸyrrzÒ›téãº7UNpSEµ†D±¤�ÒÓ¦á9Ë)ºF’ËæmoÈöœ}K¯êÉœ1ïx tdŒû�Îá-ÕùùíûõÞ÷‚¿É5 KJ$H¬ËSK²´!zÉÍq¼ƒu….iŽÇ¡ÕƒC ¿�õë‰C=ê<è2žZì=êÊPM�:A=ÊÔ½k¥´§ru�:–±’µR¾Q­rŽ5’ûEð%düEÙæwÍçHˆ3pÎ!O–U×ö\›_s'AwRiówE#‘ÁŠ#9^¯KJ{×a]÷+rF^tˆžH"S(œ°r §‘<˜è íϹýúÅlæ�C[å°B®¹ñ½7½FÔ.¡’Ñ’û-˜‘›Ñ©îÌìà¨,‹ÝÙëϺƒºk6g'1hžÑËFQ‘ŽÍ,_(´–J;öuк^ïŽ}…ߨsǾ‰²TÓ±ÏúŽEjî²éÜ¢½ÃÀ¿˜¼o&ó”uaB’¦íEx²ý=F«ÊáèÈW¸Ú„Ì NòŽq'D~7ói°%”:ÙSüHלõ—_cg@0X�^£‰F?b?MèzÙ¢Î9oË\Ÿ˜ñ÷Îù�¶Y�#L@NHÒqÌ¥Z™³yŸú¸~Œ¿zŸSÂ!ÈCÒ¬u]÷ós3]ѣ뽋€Ü5B².Ms›®Ëçç}tåâ;³Ÿ6¼ÊMäYN(eÛC‹­š‡6XƒNSiι—£ŸÃ›Ø Sߪž‡öy¼¶&òêô�Ñyh딤´j:Úžòeü­éh­º}úçÊÔP8m¦Æ-í䌌mx-ûëÉhÅb“á ë÷ÅŒëÔ“ѦæÎ› Vfpºßû� Ù¥%Ë þk:›NÓ÷¿ù» 3:±K ’o$”¤ö ƒx$il;èz?ÓezÌ_GlºØ·"®: ²ÕˆG€FØá�FèX©*yb�ÍZ!©?©p+*ƒ/ÔˆMbw“Pñ­ â©o“нµ l d¡º -5:u/s_.,?]\m²ß �¢6ÙX_ÎFyL+æ�mÕ*î)Ô¬Q‚Që±Â¿­ ©F¡§�A<Š¥©8r6K#š¢œ6ˆòâl6Án»V2ш³Yp—²€x5Ëfvàål&~^pþYŒgÙ‡ ë8Ö#ÝzÕŽõ=Þ°2”ô ÙP]ÇÛZy˜&«’¦xp²�sÑdQ™Ç7¢™!ÆßdÞ!ƒx›ì1éuý&4A€eÑ(«e+|¤ä_¦cÙ†Ü RÝ`‘<�StÒx2U,>Æ`†"y0¾µÂ*ê(Ž×2•Ä8™lhxe'*K}éo‹ÒJÊXÖÀ žZœj™Ë63X–¥ž“½LØÐ%’¥ž¬ÀÑjÒ*²Ô?<3EYê‰G3°E«ÈR/9¸Ëg©'^G€!Yê¥çô5ÎRO´·kÅügÛµ’üg|ô+~¹8®Ud©ìøÂYê‰ÆãZ1�×ãZI–zA:’YêÙ|]Œ�–Pî0%—ÈR¿jA8¢Ud©¯¥v‹g©'²{€µŠ,õ:�È«Ó*²ÔKWGÄÕ²­ø"áqÈÇ¥u—;ç)‚A<ÊÞþ)¨Ø“�OÆïAPñ§,‹A ÆÁ•ô§ªyUB¡WK˜ÔܨUd©çt*fá7œE3§/9cÉtè�ã²;عF×O¡äßöµE8o…|´ö½íF8YȪʩŒA<ŠÞ¾zRŒ6­0©ç´ } @¹iÁFY:”ždƒâËa}hc°åDN)$C#°²�ŸÂ7îSvþ�Šõxþhv;¡°„í�Û•5KSa D¨]:� ȉxÚe+p?äýÒí"GŠ(öBš¿„/Ê3k/B�3ƒ<OãôÏ@>#Ý80ÍiŸ³À �/(kŸut–X¤]®¯A¾O»\^‡|]º]šûu+³bÙÖ\š?âQ¹|ò Êj":#G�ÿ±S«ëàOÅ70(7øo‘¥CY!ZÄ#Y+“ì6•nf’Ʋ�§Óˆ¶n›+”«ÀÛ˲÷O~¸P+C¡€ '»d%õ|Ær¤R½0—%_eû”C—Û-—‘å†ÉdÁ\c Ë=Z7kó(b­­Ó¡ÖHÈûj¯-]ø"a²Ð4¡tÅ=,Pùû� Ù¸²xv4^­êIÃ6ý ÒÏ_›Ñò†;î9¦I7æ '°F^>¤ŵó�Pp”ÂÐÇûB{¡^„!q._¨sÑX1uƒlæ’‘!“iÎÏ›Iþa¸”_«SšÞ“^”™E3½l»î„�÷|%³ß¾'W©Zïå,Ç­ßeºµ@§c¼5º|Ú±–Ó¦µ–?x–Ž7 dnœÇmóö¡èÕ8¯Zuò´©ßO2ˆG‘éyP|Ô]¨¨ 5�P¥Ñ7ÔÇG%J ÊÍÖËÒ!»Ø¤Ef ½5q=ëx¦/e¸½Ï»=‘qÝT ]ˆ™ÉN\»c,x¦ù¥~oÑJ.z–÷u¢©§ OI¿Î¨«þº½èE6¢»PsLLSÓÿé™x?ËT’—~(ŽBUæK4Ë< ü-@fꨬCÓÖìÌqæLAEék€ÌlO²]7év~Î+’{t "{€ÁL¡GYulpí›cXé°ª8€×�Hû׸ô€´Š6›ƒh¤K®«É{Ø„–"›€�;D(ñr5F4:ÄwÃ1A}ê©?l\|u4.S¤ÿ‚E†3H‘§Íû®Ivü¸Í9Ãr­y�£€jÈ�œ÷µ�û´KŸ  $ù2;)Š­ƒ‹4Ú8¦ëòòç‚#Bf�K’ÝĨî«ýÞX¿@·†­$ÍrÙ{ÅúEʱd:kGG}¬g‡ÆžÆØá5ûŠ‘¶Rz²0"rWì‹Ì;äÉQŦRQê§Š£ÊuÕ–“Ü0 K“S¼†E„öA>¤lèŒ\•†ööj…-¼¸íßÇ IkùãÎ…N2·h…u+¢ÔÜYhÑœOC¨¸uÀÈBþ‚œ†Pñ;Ä#;˜�Îæ)WÁrÎrÕEЬŒ@UF4ÙÁDí†ñ邃U¡â:µâiÕNM…Ui÷}‰DJħ8Yè4@ ¯ÁëžRrÍs¯È;¡öÙ¢†¸SMn/ŠÍ„ÁŒû’œ·z›‹Ž¹´ì�º{jÏIŒÍ w)J­ÎŸ]ÀäDíužŠÛÜYþDâð0äÃÒdÚV-3�’èlê…àða[üc ã2ËͲ"–)¢3@ô¡´ˆœqUßÀ ž¸i0Ù7$k£êjÉ Ö �>Zolʯ–ôËÖÑèd°N«%ch¬ë¤ÆHá HãÌDÒÉé`äö—¯Ù¡}ÉX¥ô3«úœéÜ£HÖÅ¿^Ê&o`^FòzKO•œÖq�á¹ó8ë¬êŽyŠøÄgx ²Ð¥¾ŸŠëž†|:þN@Å�2ˆG’Æn:;ä‡[�U›Ç¡*„r»Š—\ˆPxò‘Úë ·Ø¹_ºÁø‚PùÀAÈò‹ ÇðŽ8¦ Î(ÝÓ¤\²8‡¦Szk°Ì^�û¥ÎAÁo@¾!ýR—.¹cB˜ÒâcÎLfs)ÿH‹Kwɲ½$/÷ÍLØëØŽA3@Þwyü /A¾$ý.=´~Nuœ3½!åŸ)£ÍËuü™ýZI®›&�‡ CÚ‘¸W.‚¡ºíä½Á´�õ�AƼ'³¹Àf7Ù yoüƒ.Ózž-2]�ÍQÒ¹EšSg’VЍùæLݘó—²DN„²ùI:!‹M]”¯¬%xr Ž· Ø¹Ž•?TçLLà¤ë Øùäb˜GàêVÎ\Ê®˜Œ-ã}�)(!3I¾Æž²±œb�‘CLáky^+Â�Lÿ¢œ6/ͣùiÔ9'G<Íõ“ïzÞlfu)›3™Á8ˆSÇ­(×@’�9÷(wE¨f”-&M œÏe—hrYü‹4"C'—32ÍÎøÿ’çÙO{ýsàÖŠ™^õZØöŒA¹Žr·ùM0$”[]a?�Ý ßuÂGÓ Oƒ¡:+ÌݹØÜ4ê:×$õš3�ÚÍÆ )¼¥T¢ózÖ¿�„…ð6*ÆÃÉúy�x_eô ÕÝ4Ü5ŸÏ º>•¡¨#Ž•Ì§�wè6OMp^è”nxÐk$* ¥{ Já¥ÞY~y!¢ÔÝÀàØ°Ð�€ÒI¨«ivžRÑKeἺDÄz�ç!Ÿ—ŸÅxc »¢Ÿ1mG`êC(7‹)Q!Ë¿ÅI†ÍÄÄgV¤×늑ì~*ETZ€m�…vxù¦RTÜ`;ävéfi/˜IÏQ6ù/Ÿ­À�å/Ûq�5lv'…ŽÜlÅl‚2ì�”6]÷¨røñ�Àp×âs L¨Î‘ã®ÅçQt€ñ^ú¥íÇ]T|ƒxâ¦q5 Ü±�ýK'Òæ½¨ùKÌâQd†¯q'u¤±n"ïdý,zoÒ÷«öÔ<﻽„÷!|²ÐåòÐb7ÞIe]t1{/¢è5@ÆÔJÛªVÁó â‘ä1üà|—ýzblÉ��åVÇÒÆÞE•C®Cõ}ÊP�í:žš{†®7ÏÒ5f?=d"iØ‹n Ùîà<…(ì5–²ywð×� $Ž4@—�9í(Iýtu#™$¦ìG†…èÏ�2!sÔ*v H¢ìÕhÀÈ~�Ö6˜ëí4“M¹yÞ™n[Og¬¤‘öèðgéM�,áäiâÍLBþF5Áƒ0¸‚Ý,ïéÒ˜‘Ê÷ /¯í±áanbó CØYÞ²˜Ùï)Oß¼81;IwÓõ™ÉY½ÐI ÑϹ½(mÙNoñ�:Ï^�P] ƒ§"^ý?ô�½Ñ"Þ‚P]œŒ6y?) DÕmZòÛ¨7 ìÕØ¨ÎÔÜ´i¤*)þzzœÕ­;ì©äŒDüÓ Eúj$�%” š¦Û¯Ó3íFyËýþyÊthÒæþ1c.´)€|Ú®s‡šäv2 MÈœ´­ë°“BuÃÎÖÒaçİÀ¸³ 6„êróÔmÜy¯@øÿ�q'‡· T7î Ñ´¸Šù:€·x|\îÓßÄÍÚSÂ!ÈCÒ¬·èºÜx逊SøJÒÚøªn¦mS šòà@¸òFyw”ª‰M¸Ä_Q+ C¨Îmx•›È=Nع¡Ãâ}”à£æá¬‚á#êá¼´ëéá¼ e¨¦)ÛSsÅ“b�îAæ¥;]ØJhë«}Rk™¯jþú%á.Èê‚5U]Ë|•A¨îh-¿æ¼ Í p�¨GTAÐ8!E¿ˆ×þ&¥J˽y@Å70ˆGPE×ÉÒùfÍ¿S ÉZéš1Óónv +S¶!?¦sRü4aä.©NÖ¹·¦æžq½ÌÙ"Sî› Âo—|ð¤a_È’CWò/Üמ²iVu#“^-á?eߦèq%_½êVå%/nH Oúó /‹¨]ñõY?65KÿV>ë˜S)— �$Ê•°ô>£-óœ‘.)Ãû`Æ¡+Å¿·03Â’v)üµ²R§½SÑeÿÄý¡·‹”5ÎVæ¯e?ÔîRÕ©¹§3¯D½â¶ ߢ¤ÆŠ›É¥ÿ¤ðç2mö+éÐ^O„v·&÷êR¥_�ʸ5¾L'¾Ø~Va”´ÿ÷ÿägÓµg)DBI/man/0000755000176200001440000000000015005323731011422 5ustar liggesusersDBI/man/dbGetQueryArrow.Rd0000644000176200001440000001502515005323731015002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetQueryArrow.R \name{dbGetQueryArrow} \alias{dbGetQueryArrow} \title{Retrieve results from a query as an Arrow object} \usage{ dbGetQueryArrow(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbGetQueryArrow()} always returns an object coercible to a \link{data.frame}, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Returns the result of a query as an Arrow object. \code{dbGetQueryArrow()} comes with a default implementation (which should work with most backends) that calls \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}}, then \code{\link[=dbFetchArrow]{dbFetchArrow()}}, ensuring that the result is always freed by \code{\link[=dbClearResult]{dbClearResult()}}. For passing query parameters, see \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}}, in particular the "The data retrieval flow for Arrow streams" section. For retrieving results as a data frame, see \code{\link[=dbGetQuery]{dbGetQuery()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetQueryArrow")} } \details{ This method is for \code{SELECT} queries only (incl. other SQL statements that return a \code{SELECT}-alike result, e.g., execution of a stored procedure or data manipulation queries like \verb{INSERT INTO ... RETURNING ...}). To execute a stored procedure that does not return a result set, use \code{\link[=dbExecute]{dbExecute()}}. Some backends may support data manipulation statements through this method. However, callers are strongly advised to use \code{\link[=dbExecute]{dbExecute()}} for data manipulation statements. } \section{Implementation notes}{ Subclasses should override this method only if they provide some sort of performance optimization. } \section{Failure modes}{ An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-\code{NA} string. The object returned by \code{dbGetQueryArrow()} can also be passed to \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}} to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific. } \section{Additional arguments}{ The following arguments are not part of the \code{dbGetQueryArrow()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Retrieve data as arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbGetQueryArrow(con, "SELECT * FROM mtcars") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For updates: \code{\link[=dbSendStatement]{dbSendStatement()}} and \code{\link[=dbExecute]{dbExecute()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIConnection generics} \concept{data retrieval generics} DBI/man/dbConnect.Rd0000644000176200001440000000754115005323731013617 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbConnect.R \name{dbConnect} \alias{dbConnect} \title{Create a connection to a DBMS} \usage{ dbConnect(drv, ...) } \arguments{ \item{drv}{An object that inherits from \link[=DBIDriver-class]{DBI::DBIDriver}, or an existing \link[=DBIConnection-class]{DBI::DBIConnection} object (in order to clone an existing connection).} \item{...}{Authentication arguments needed by the DBMS instance; these typically include \code{user}, \code{password}, \code{host}, \code{port}, \code{dbname}, etc. For details see the appropriate \code{DBIDriver}.} } \value{ \code{dbConnect()} returns an S4 object that inherits from \link[DBI:DBIConnection-class]{DBI::DBIConnection}. This object is used to communicate with the database engine. A \code{\link[=format]{format()}} method is defined for the connection object. It returns a string that consists of a single line of text. } \description{ Connect to a DBMS going through the appropriate authentication procedure. Some implementations may allow you to have multiple connections open, so you may invoke this function repeatedly assigning its output to different objects. The authentication mechanism is left unspecified, so check the documentation of individual drivers for details. Use \code{\link[=dbCanConnect]{dbCanConnect()}} to check if a connection can be established. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbConnect")} } \section{Specification}{ DBI recommends using the following argument names for authentication parameters, with \code{NULL} default: \itemize{ \item \code{user} for the user name (default: current user) \item \code{password} for the password \item \code{host} for the host name (default: local connection) \item \code{port} for the port number (default: local connection) \item \code{dbname} for the name of the database on the host, or the database file name } The defaults should provide reasonable behavior, in particular a local connection for \code{host = NULL}. For some DBMS (e.g., PostgreSQL), this is different to a TCP/IP connection to \code{localhost}. In addition, DBI supports the \code{bigint} argument that governs how 64-bit integer data is returned. The following values are supported: \itemize{ \item \code{"integer"}: always return as \code{integer}, silently overflow \item \code{"numeric"}: always return as \code{numeric}, silently round \item \code{"character"}: always return the decimal representation as \code{character} \item \code{"integer64"}: return as a data type that can be coerced using \code{\link[=as.integer]{as.integer()}} (with warning on overflow), \code{\link[=as.numeric]{as.numeric()}} and \code{\link[=as.character]{as.character()}} } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} # SQLite only needs a path to the database. (Here, ":memory:" is a special # path that creates an in-memory database.) Other database drivers # will require more details (like user, password, host, port, etc.) con <- dbConnect(RSQLite::SQLite(), ":memory:") con dbListTables(con) dbDisconnect(con) # Bad, for subtle reasons: # This code fails when RSQLite isn't loaded yet, # because dbConnect() doesn't know yet about RSQLite. dbListTables(con <- dbConnect(RSQLite::SQLite(), ":memory:")) \dontshow{\}) # examplesIf} } \seealso{ \code{\link[=dbDisconnect]{dbDisconnect()}} to disconnect from a database. Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} Other DBIConnector generics: \code{\link{DBIConnector-class}}, \code{\link{dbDataType}()}, \code{\link{dbGetConnectArgs}()}, \code{\link{dbIsReadOnly}()} } \concept{DBIConnector generics} \concept{DBIDriver generics} DBI/man/DBI-package.Rd0000644000176200001440000000513115005323731013700 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/DBI-package.R \docType{package} \name{DBI-package} \alias{DBI} \alias{DBI-package} \title{DBI: R Database Interface} \description{ DBI defines an interface for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations (so-called \emph{DBI backends}). } \section{Definition}{ A DBI backend is an R package which imports the \pkg{DBI} and \pkg{methods} packages. For better or worse, the names of many existing backends start with \sQuote{R}, e.g., \pkg{RSQLite}, \pkg{RMySQL}, \pkg{RSQLServer}; it is up to the backend author to adopt this convention or not. } \section{DBI classes and methods}{ A backend defines three classes, which are subclasses of \link[DBI:DBIDriver-class]{DBI::DBIDriver}, \link[DBI:DBIConnection-class]{DBI::DBIConnection}, and \link[DBI:DBIResult-class]{DBI::DBIResult}. The backend provides implementation for all methods of these base classes that are defined but not implemented by DBI. All methods defined in \pkg{DBI} are reexported (so that the package can be used without having to attach \pkg{DBI}), and have an ellipsis \code{...} in their formals for extensibility. } \section{Construction of the DBIDriver object}{ The backend must support creation of an instance of its \link[DBI:DBIDriver-class]{DBI::DBIDriver} subclass with a \dfn{constructor function}. By default, its name is the package name without the leading \sQuote{R} (if it exists), e.g., \code{SQLite} for the \pkg{RSQLite} package. However, backend authors may choose a different name. The constructor must be exported, and it must be a function that is callable without arguments. DBI recommends to define a constructor with an empty argument list. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} RSQLite::SQLite() \dontshow{\}) # examplesIf} } \seealso{ Important generics: \code{\link[=dbConnect]{dbConnect()}}, \code{\link[=dbGetQuery]{dbGetQuery()}}, \code{\link[=dbReadTable]{dbReadTable()}}, \code{\link[=dbWriteTable]{dbWriteTable()}}, \code{\link[=dbDisconnect]{dbDisconnect()}} Formal specification (currently work in progress and incomplete): \code{vignette("spec", package = "DBI")} } \author{ \strong{Maintainer}: Kirill Müller \email{kirill@cynkra.com} (\href{https://orcid.org/0000-0002-1416-3412}{ORCID}) Authors: \itemize{ \item R Special Interest Group on Databases (R-SIG-DB) \item Hadley Wickham } Other contributors: \itemize{ \item R Consortium [funder] } } DBI/man/dbAppendTableArrow.Rd0000644000176200001440000001326315005323731015416 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/21-dbAppendTableArrow.R \name{dbAppendTableArrow} \alias{dbAppendTableArrow} \title{Insert rows into a table from an Arrow stream} \usage{ dbAppendTableArrow(conn, name, value, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{value}{An object coercible with \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}}.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbAppendTableArrow()} returns a scalar numeric. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} The \code{dbAppendTableArrow()} method assumes that the table has been created beforehand, e.g. with \code{\link[=dbCreateTableArrow]{dbCreateTableArrow()}}. The default implementation calls \code{\link[=dbAppendTable]{dbAppendTable()}} for each chunk of the stream. Use \code{\link[=dbAppendTable]{dbAppendTable()}} to append data from a data.frame. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbAppendTableArrow")} } \section{Failure modes}{ If the table does not exist, or the new data in \code{values} is not a data frame or has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. } \section{Specification}{ SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with \code{\link[DBI:dbReadTable]{DBI::dbReadTable()}}: \itemize{ \item integer \item numeric (the behavior for \code{Inf} and \code{NaN} is not specified) \item logical \item \code{NA} as NULL \item 64-bit values (using \code{"bigint"} as field type); the result can be \itemize{ \item converted to a numeric, which may lose precision, \item converted a character vector, which gives the full decimal representation \item written to another table and read again unchanged } \item character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings) \item factor (possibly returned as character) \item objects of type \link[blob:blob]{blob::blob} (if supported by the database) \item date (if supported by the database; returned as \code{Date}) also for dates prior to 1970 or 1900 or after 2038 \item time (if supported by the database; returned as objects that inherit from \code{difftime}) \item timestamp (if supported by the database; returned as \code{POSIXct} respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) } Mixing column types in the same table is supported. The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbAppendTableArrow()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done to support databases that allow non-syntactic names for their objects: } The \code{value} argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTableArrow(con, "iris", iris[0, ]) dbAppendTableArrow(con, "iris", iris[1:5, ]) dbReadTable(con, "iris") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbGetQuery.Rd0000644000176200001440000001610515005323731013767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetQuery.R \name{dbGetQuery} \alias{dbGetQuery} \title{Retrieve results from a query} \usage{ dbGetQuery(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbGetQuery()} always returns a \link{data.frame}, with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. } \description{ Returns the result of a query as a data frame. \code{dbGetQuery()} comes with a default implementation (which should work with most backends) that calls \code{\link[=dbSendQuery]{dbSendQuery()}}, then \code{\link[=dbFetch]{dbFetch()}}, ensuring that the result is always freed by \code{\link[=dbClearResult]{dbClearResult()}}. For retrieving chunked/paged results or for passing query parameters, see \code{\link[=dbSendQuery]{dbSendQuery()}}, in particular the "The data retrieval flow" section. For retrieving results as an Arrow object, see \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetQuery")} } \details{ This method is for \code{SELECT} queries only (incl. other SQL statements that return a \code{SELECT}-alike result, e.g., execution of a stored procedure or data manipulation queries like \verb{INSERT INTO ... RETURNING ...}). To execute a stored procedure that does not return a result set, use \code{\link[=dbExecute]{dbExecute()}}. Some backends may support data manipulation statements through this method for compatibility reasons. However, callers are strongly advised to use \code{\link[=dbExecute]{dbExecute()}} for data manipulation statements. } \section{Implementation notes}{ Subclasses should override this method only if they provide some sort of performance optimization. } \section{Failure modes}{ An error is raised when issuing a query over a closed or invalid connection, if the syntax of the query is invalid, or if the query is not a non-\code{NA} string. If the \code{n} argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to \code{dbGetQuery()} with proper \code{n} argument succeeds. } \section{Additional arguments}{ The following arguments are not part of the \code{dbGetQuery()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{n} (default: -1) \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. } \section{Specification}{ A column named \code{row_names} is treated like any other column. The \code{n} argument specifies the number of rows to be fetched. If omitted, fetching multi-row queries with one or more columns returns the entire result. A value of \link{Inf} for the \code{n} argument is supported and also returns the full result. If more rows than available are fetched (by passing a too large value for \code{n}), the result is returned in full without warning. If zero rows are requested, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued. The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbGetQuery(con, "SELECT * FROM mtcars") dbGetQuery(con, "SELECT * FROM mtcars", n = 6) # Pass values using the param argument: # (This query runs eight times, once for each different # parameter. The resulting rows are combined into a single # data frame.) dbGetQuery( con, "SELECT COUNT(*) FROM mtcars WHERE cyl = ?", params = list(1:8) ) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For updates: \code{\link[=dbSendStatement]{dbSendStatement()}} and \code{\link[=dbExecute]{dbExecute()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIConnection generics} \concept{data retrieval generics} DBI/man/dbListObjects.Rd0000644000176200001440000001077015005323731014451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbListObjects.R \name{dbListObjects} \alias{dbListObjects} \title{List remote objects} \usage{ dbListObjects(conn, prefix = NULL, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{prefix}{A fully qualified path in the database's namespace, or \code{NULL}. This argument will be processed with \code{\link[=dbUnquoteIdentifier]{dbUnquoteIdentifier()}}. If given the method will return all objects accessible through this prefix.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbListObjects()} returns a data frame with columns \code{table} and \code{is_prefix} (in that order), optionally with other columns with a dot (\code{.}) prefix. The \code{table} column is of type list. Each object in this list is suitable for use as argument in \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}. The \code{is_prefix} column is a logical. This data frame contains one row for each object (schema, table and view) accessible from the prefix (if passed) or from the global namespace (if prefix is omitted). Tables added with \code{\link[DBI:dbWriteTable]{DBI::dbWriteTable()}} are part of the data frame. As soon a table is removed from the database, it is also removed from the data frame of database objects. The same applies to temporary objects if supported by the database. The returned names are suitable for quoting with \code{dbQuoteIdentifier()}. } \description{ Returns the names of remote objects accessible through this connection as a data frame. This should include temporary objects, but not all database backends (in particular \pkg{RMariaDB} and \pkg{RMySQL}) support this. Compared to \code{\link[=dbListTables]{dbListTables()}}, this method also enumerates tables and views in schemas, and returns fully qualified identifiers to access these objects. This allows exploration of all database objects available to the current user, including those that can only be accessed by giving the full namespace. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbListObjects")} } \section{Failure modes}{ An error is raised when calling this method for a closed or invalid connection. } \section{Specification}{ The \code{prefix} column indicates if the \code{table} value refers to a table or a prefix. For a call with the default \code{prefix = NULL}, the \code{table} values that have \code{is_prefix == FALSE} correspond to the tables returned from \code{\link[DBI:dbListTables]{DBI::dbListTables()}}, The \code{table} object can be quoted with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}. The result of quoting can be passed to \code{\link[DBI:dbUnquoteIdentifier]{DBI::dbUnquoteIdentifier()}}. (For backends it may be convenient to use the \link[DBI:Id]{DBI::Id} class, but this is not required.) Values in \code{table} column that have \code{is_prefix == TRUE} can be passed as the \code{prefix} argument to another call to \code{dbListObjects()}. For the data frame returned from a \code{dbListObject()} call with the \code{prefix} argument set, all \code{table} values where \code{is_prefix} is \code{FALSE} can be used in a call to \code{\link[DBI:dbExistsTable]{DBI::dbExistsTable()}} which returns \code{TRUE}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbListObjects(con) dbWriteTable(con, "mtcars", mtcars) dbListObjects(con) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbQuoteIdentifier.Rd0000644000176200001440000000761515005323731015330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbQuoteIdentifier.R \name{dbQuoteIdentifier} \alias{dbQuoteIdentifier} \title{Quote identifiers} \usage{ dbQuoteIdentifier(conn, x, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{x}{A character vector, \link{SQL} or \link{Id} object to quote as identifier.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbQuoteIdentifier()} returns an object that can be coerced to \link{character}, of the same length as the input. For an empty character vector this function returns a length-0 object. The names of the input argument are preserved in the output. When passing the returned object again to \code{dbQuoteIdentifier()} as \code{x} argument, it is returned unchanged. Passing objects of class \link[DBI:SQL]{DBI::SQL} should also return them unchanged. (For backends it may be most convenient to return \link[DBI:SQL]{DBI::SQL} objects to achieve this behavior, but this is not required.) } \description{ Call this method to generate a string that is suitable for use in a query as a column or table name, to make sure that you generate valid SQL and protect against SQL injection attacks. The inverse operation is \code{\link[=dbUnquoteIdentifier]{dbUnquoteIdentifier()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbQuoteIdentifier")} } \section{Failure modes}{ An error is raised if the input contains \code{NA}, but not for an empty string. } \section{Specification}{ Calling \code{\link[DBI:dbGetQuery]{DBI::dbGetQuery()}} for a query of the format \verb{SELECT 1 AS ...} returns a data frame with the identifier, unquoted, as column name. Quoted identifiers can be used as table and column names in SQL queries, in particular in queries like \verb{SELECT 1 AS ...} and \verb{SELECT * FROM (SELECT 1) ...}. The method must use a quoting mechanism that is unambiguously different from the quoting mechanism used for strings, so that a query like \verb{SELECT ... FROM (SELECT 1 AS ...)} throws an error if the column names do not match. The method can quote column names that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this. In any case, checking the validity of the identifier should be performed only when executing a query, and not by \code{dbQuoteIdentifier()}. } \examples{ # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteIdentifier(ANSI(), name) # Use Id() to specify other components such as the schema id_name <- Id(schema = "schema_name", table = "table_name") id_name dbQuoteIdentifier(ANSI(), id_name) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteIdentifier(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteIdentifier(ANSI(), dbQuoteIdentifier(ANSI(), name)) } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbWriteTableArrow.Rd0000644000176200001440000001660715005323731015306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/23-dbWriteTableArrow.R \name{dbWriteTableArrow} \alias{dbWriteTableArrow} \title{Copy Arrow objects to database tables} \usage{ dbWriteTableArrow(conn, name, value, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{value}{An nanoarray stream, or an object coercible to a nanoarray stream with \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}}.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbWriteTableArrow()} returns \code{TRUE}, invisibly. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Writes, overwrites or appends an Arrow object to a database table. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbWriteTableArrow")} } \details{ This function expects an Arrow object. Convert a data frame to an Arrow object with \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}} or use \code{\link[=dbWriteTable]{dbWriteTable()}} to write a data frame. This function is useful if you want to create and load a table at the same time. Use \code{\link[=dbAppendTableArrow]{dbAppendTableArrow()}} for appending data to an existing table, \code{\link[=dbCreateTableArrow]{dbCreateTableArrow()}} for creating a table and specifying field types, and \code{\link[=dbRemoveTable]{dbRemoveTable()}} for overwriting tables. } \section{Failure modes}{ If the table exists, and both \code{append} and \code{overwrite} arguments are unset, or \code{append = TRUE} and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Invalid values for the additional arguments \code{overwrite}, \code{append}, and \code{temporary} (non-scalars, unsupported data types, \code{NA}, incompatible values, incompatible columns) also raise an error. } \section{Additional arguments}{ The following arguments are not part of the \code{dbWriteTableArrow()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{overwrite} (default: \code{FALSE}) \item \code{append} (default: \code{FALSE}) \item \code{temporary} (default: \code{FALSE}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbWriteTableArrow()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } The \code{value} argument must be a data frame with a subset of the columns of the existing table if \code{append = TRUE}. The order of the columns does not matter with \code{append = TRUE}. If the \code{overwrite} argument is \code{TRUE}, an existing table of the same name will be overwritten. This argument doesn't change behavior if the table does not exist yet. If the \code{append} argument is \code{TRUE}, the rows in an existing table are preserved, and the new data are appended. If the table doesn't exist yet, it is created. If the \code{temporary} argument is \code{TRUE}, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with \code{\link[DBI:dbReadTable]{DBI::dbReadTable()}}: \itemize{ \item integer \item numeric (the behavior for \code{Inf} and \code{NaN} is not specified) \item logical \item \code{NA} as NULL \item 64-bit values (using \code{"bigint"} as field type); the result can be \itemize{ \item converted to a numeric, which may lose precision, \item converted a character vector, which gives the full decimal representation \item written to another table and read again unchanged } \item character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string \item factor (possibly returned as character) \item objects of type \link[blob:blob]{blob::blob} (if supported by the database) \item date (if supported by the database; returned as \code{Date}), also for dates prior to 1970 or 1900 or after 2038 \item time (if supported by the database; returned as objects that inherit from \code{difftime}) \item timestamp (if supported by the database; returned as \code{POSIXct} respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) } Mixing column types in the same table is supported. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTableArrow(con, "mtcars", nanoarrow::as_nanoarrow_array_stream(mtcars[1:5, ])) dbReadTable(con, "mtcars") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()} } \concept{DBIConnection generics} DBI/man/dbDataType.Rd0000644000176200001440000001200515005323731013730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbDataType.R \name{dbDataType} \alias{dbDataType} \title{Determine the SQL data type of an object} \usage{ dbDataType(dbObj, obj, ...) } \arguments{ \item{dbObj}{A object inheriting from \link[=DBIDriver-class]{DBI::DBIDriver} or \link[=DBIConnection-class]{DBI::DBIConnection}} \item{obj}{An R object whose SQL type we want to determine.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbDataType()} returns the SQL type that corresponds to the \code{obj} argument as a non-empty character string. For data frames, a character vector with one element per column is returned. } \description{ Returns an SQL string that describes the SQL data type to be used for an object. The default implementation of this generic determines the SQL type of an R object according to the SQL 92 specification, which may serve as a starting point for driver implementations. DBI also provides an implementation for data.frame which will return a character vector giving the type for each column in the dataframe. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbDataType")} } \details{ The data types supported by databases are different than the data types in R, but the mapping between the primitive types is straightforward: \itemize{ \item Any of the many fixed and varying length character types are mapped to character vectors \item Fixed-precision (non-IEEE) numbers are mapped into either numeric or integer vectors. } Notice that many DBMS do not follow IEEE arithmetic, so there are potential problems with under/overflows and loss of precision. } \section{Failure modes}{ An error is raised for invalid values for the \code{obj} argument such as a \code{NULL} value. } \section{Specification}{ The backend can override the \code{\link[DBI:dbDataType]{DBI::dbDataType()}} generic for its driver class. This generic expects an arbitrary object as second argument. To query the values returned by the default implementation, run \code{example(dbDataType, package = "DBI")}. If the backend needs to override this generic, it must accept all basic R data types as its second argument, namely \link{logical}, \link{integer}, \link{numeric}, \link{character}, dates (see \link{Dates}), date-time (see \link{DateTimeClasses}), and \link{difftime}. If the database supports blobs, this method also must accept lists of \link{raw} vectors, and \link[blob:blob]{blob::blob} objects. As-is objects (i.e., wrapped by \code{\link[=I]{I()}}) must be supported and return the same results as their unwrapped counterparts. The SQL data type for \link{factor} and \link{ordered} is the same as for character. The behavior for other object types is not specified. All data types returned by \code{dbDataType()} are usable in an SQL statement of the form \code{"CREATE TABLE test (a ...)"}. } \examples{ dbDataType(ANSI(), 1:5) dbDataType(ANSI(), 1) dbDataType(ANSI(), TRUE) dbDataType(ANSI(), Sys.Date()) dbDataType(ANSI(), Sys.time()) dbDataType(ANSI(), Sys.time() - as.POSIXct(Sys.Date())) dbDataType(ANSI(), c("x", "abc")) dbDataType(ANSI(), list(raw(10), raw(20))) dbDataType(ANSI(), I(3)) dbDataType(ANSI(), iris) \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbDataType(con, 1:5) dbDataType(con, 1) dbDataType(con, TRUE) dbDataType(con, Sys.Date()) dbDataType(con, Sys.time()) dbDataType(con, Sys.time() - as.POSIXct(Sys.Date())) dbDataType(con, c("x", "abc")) dbDataType(con, list(raw(10), raw(20))) dbDataType(con, I(3)) dbDataType(con, iris) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other DBIConnector generics: \code{\link{DBIConnector-class}}, \code{\link{dbConnect}()}, \code{\link{dbGetConnectArgs}()}, \code{\link{dbIsReadOnly}()} } \concept{DBIConnection generics} \concept{DBIConnector generics} \concept{DBIDriver generics} DBI/man/dot-SQL92Keywords.Rd0000644000176200001440000000064114602466070015046 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \docType{data} \name{.SQL92Keywords} \alias{.SQL92Keywords} \title{Keywords according to the SQL-92 standard} \format{ An object of class \code{character} of length 220. } \usage{ .SQL92Keywords } \description{ A character vector of SQL-92 keywords, uppercase. } \examples{ "SELECT" \%in\% .SQL92Keywords } \keyword{datasets} DBI/man/transactions.Rd0000644000176200001440000000763315005323731014432 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbBegin.R, R/dbCommit.R, R/dbRollback.R, % R/transactions.R \name{dbBegin} \alias{dbBegin} \alias{dbCommit} \alias{dbRollback} \alias{transactions} \title{Begin/commit/rollback SQL transactions} \usage{ dbBegin(conn, ...) dbCommit(conn, ...) dbRollback(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbBegin()}, \code{dbCommit()} and \code{dbRollback()} return \code{TRUE}, invisibly. } \description{ A transaction encapsulates several SQL statements in an atomic unit. It is initiated with \code{dbBegin()} and either made persistent with \code{dbCommit()} or undone with \code{dbRollback()}. In any case, the DBMS guarantees that either all or none of the statements have a permanent effect. This helps ensuring consistency of write operations to multiple tables. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("transactions")} } \details{ Not all database engines implement transaction management, in which case these methods should not be implemented for the specific \linkS4class{DBIConnection} subclass. } \section{Failure modes}{ The implementations are expected to raise an error in case of failure, but this is not tested. In any way, all generics throw an error with a closed or invalid connection. In addition, a call to \code{dbCommit()} or \code{dbRollback()} without a prior call to \code{dbBegin()} raises an error. Nested transactions are not supported by DBI, an attempt to call \code{dbBegin()} twice yields an error. } \section{Specification}{ Actual support for transactions may vary between backends. A transaction is initiated by a call to \code{dbBegin()} and committed by a call to \code{dbCommit()}. Data written in a transaction must persist after the transaction is committed. For example, a record that is missing when the transaction is started but is created during the transaction must exist both during and after the transaction, and also in a new connection. A transaction can also be aborted with \code{dbRollback()}. All data written in such a transaction must be removed after the transaction is rolled back. For example, a record that is missing when the transaction is started but is created during the transaction must not exist anymore after the rollback. Disconnection from a connection with an open transaction effectively rolls back the transaction. All data written in such a transaction must be removed after the transaction is rolled back. The behavior is not specified if other arguments are passed to these functions. In particular, \pkg{RSQLite} issues named transactions with support for nesting if the \code{name} argument is set. The transaction isolation level is not specified by DBI. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) # All operations are carried out as logical unit: dbBegin(con) withdrawal <- 300 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) dbCommit(con) dbReadTable(con, "cash") dbReadTable(con, "account") # Rolling back after detecting negative value on account: dbBegin(con) withdrawal <- 5000 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) if (dbReadTable(con, "account")$amount >= 0) { dbCommit(con) } else { dbRollback(con) } dbReadTable(con, "cash") dbReadTable(con, "account") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Self-contained transactions: \code{\link[=dbWithTransaction]{dbWithTransaction()}} } DBI/man/dbListConnections.Rd0000644000176200001440000000147714542245565015363 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbListConnections.R \name{dbListConnections} \alias{dbListConnections} \title{List currently open connections} \usage{ dbListConnections(drv, ...) } \arguments{ \item{drv}{A object inheriting from \linkS4class{DBIDriver}} \item{...}{Other arguments passed on to methods.} } \value{ a list } \description{ DEPRECATED, drivers are no longer required to implement this method. Keep track of the connections you opened if you require a list. } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()} } \concept{DBIDriver generics} \keyword{internal} DBI/man/dbExistsTable.Rd0000644000176200001440000000641415005323731014453 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbExistsTable.R \name{dbExistsTable} \alias{dbExistsTable} \title{Does a table exist?} \usage{ dbExistsTable(conn, name, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbExistsTable()} returns a logical scalar, \code{TRUE} if the table or view specified by the \code{name} argument exists, \code{FALSE} otherwise. This includes temporary tables if supported by the database. } \description{ Returns if a table given by name exists in the database. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbExistsTable")} } \section{Failure modes}{ An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbExistsTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } For all tables listed by \code{\link[DBI:dbListTables]{DBI::dbListTables()}}, \code{dbExistsTable()} returns \code{TRUE}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbExistsTable(con, "iris") dbWriteTable(con, "iris", iris) dbExistsTable(con, "iris") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbExecute.Rd0000644000176200001440000001337115005323731013626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbExecute.R \name{dbExecute} \alias{dbExecute} \title{Change database state} \usage{ dbExecute(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbExecute()} always returns a scalar numeric that specifies the number of rows affected by the statement. } \description{ Executes a statement and returns the number of rows affected. \code{dbExecute()} comes with a default implementation (which should work with most backends) that calls \code{\link[=dbSendStatement]{dbSendStatement()}}, then \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}}, ensuring that the result is always freed by \code{\link[=dbClearResult]{dbClearResult()}}. For passing query parameters, see \code{\link[=dbBind]{dbBind()}}, in particular the "The command execution flow" section. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbExecute")} } \details{ You can also use \code{dbExecute()} to call a stored procedure that performs data manipulation or other actions that do not return a result set. To execute a stored procedure that returns a result set, or a data manipulation query that also returns a result set such as \verb{INSERT INTO ... RETURNING ...}, use \code{\link[=dbGetQuery]{dbGetQuery()}} instead. } \section{Implementation notes}{ Subclasses should override this method only if they provide some sort of performance optimization. } \section{Failure modes}{ An error is raised when issuing a statement over a closed or invalid connection, if the syntax of the statement is invalid, or if the statement is not a non-\code{NA} string. } \section{Additional arguments}{ The following arguments are not part of the \code{dbExecute()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" sections for details on their usage. } \section{Specification}{ The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) dbReadTable(con, "cars") # there are 3 rows dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) dbReadTable(con, "cars") # there are now 6 rows # Pass values using the param argument: dbExecute( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)", params = list(4:7, 5:8) ) dbReadTable(con, "cars") # there are now 10 rows dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For queries: \code{\link[=dbSendQuery]{dbSendQuery()}} and \code{\link[=dbGetQuery]{dbGetQuery()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other command execution generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbSendStatement}()} } \concept{DBIConnection generics} \concept{command execution generics} DBI/man/DBIConnector-class.Rd0000644000176200001440000000316715005150137015272 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/DBIConnector.R \docType{class} \name{DBIConnector-class} \alias{DBIConnector-class} \title{DBIConnector class} \description{ Wraps objects of the \linkS4class{DBIDriver} class to include connection options. The purpose of this class is to store both the driver and the connection options. A database connection can be established with a call to \code{\link[=dbConnect]{dbConnect()}}, passing only that object without additional arguments. } \details{ To prevent leakage of passwords and other credentials, this class supports delayed evaluation. All arguments can optionally be a function (callable without arguments). In such a case, the function is evaluated transparently when connecting in \code{\link[=dbGetConnectArgs]{dbGetConnectArgs()}}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Create a connector: cnr <- new("DBIConnector", .drv = RSQLite::SQLite(), .conn_args = list(dbname = ":memory:") ) cnr # Establish a connection through this connector: con <- dbConnect(cnr) con # Access the database through this connection: dbGetQuery(con, "SELECT 1 AS a") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBI classes: \code{\link{DBIConnection-class}}, \code{\link{DBIDriver-class}}, \code{\link{DBIObject-class}}, \code{\link{DBIResult-class}}, \code{\link{DBIResultArrow-class}} Other DBIConnector generics: \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbGetConnectArgs}()}, \code{\link{dbIsReadOnly}()} } \concept{DBI classes} \concept{DBIConnector generics} DBI/man/sqlData.Rd0000644000176200001440000000330715005150137013303 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sqlData.R \name{sqlData} \alias{sqlData} \title{Convert a data frame into form suitable for upload to an SQL database} \usage{ sqlData(con, value, row.names = NA, ...) } \arguments{ \item{con}{A database connection.} \item{value}{A data frame} \item{row.names}{Either \code{TRUE}, \code{FALSE}, \code{NA} or a string. If \code{TRUE}, always translate row names to a column called "row_names". If \code{FALSE}, never translate row names. If \code{NA}, translate rownames only if they're a character vector. A string is equivalent to \code{TRUE}, but allows you to override the default name. For backward compatibility, \code{NULL} is equivalent to \code{FALSE}.} \item{...}{Other arguments used by individual methods.} } \description{ This is a generic method that coerces R objects into vectors suitable for upload to the database. The output will vary a little from method to method depending on whether the main upload device is through a single SQL string or multiple parameterized queries. This method is mostly useful for backend implementers. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("sqlData")} } \details{ The default method: \itemize{ \item Converts factors to characters \item Quotes all strings with \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} \item Converts all columns to strings with \code{\link[=dbQuoteLiteral]{dbQuoteLiteral()}} \item Replaces NA with NULL } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") sqlData(con, head(iris)) sqlData(con, head(mtcars)) dbDisconnect(con) \dontshow{\}) # examplesIf} } DBI/man/dbReadTable.Rd0000644000176200001440000001214415005323731014044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbReadTable.R \name{dbReadTable} \alias{dbReadTable} \title{Read database tables as data frames} \usage{ dbReadTable(conn, name, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbReadTable()} returns a data frame that contains the complete data from the remote table, effectively the result of calling \code{\link[DBI:dbGetQuery]{DBI::dbGetQuery()}} with \verb{SELECT * FROM }. An empty table is returned as a data frame with zero rows. The presence of \link{rownames} depends on the \code{row.names} argument, see \code{\link[DBI:rownames]{DBI::sqlColumnToRownames()}} for details: \itemize{ \item If \code{FALSE} or \code{NULL}, the returned data frame doesn't have row names. \item If \code{TRUE}, a column named "row_names" is converted to row names. } \itemize{ \item If \code{NA}, a column named "row_names" is converted to row names if it exists, otherwise no translation occurs. \item If a string, this specifies the name of the column in the remote table that contains the row names. } The default is \code{row.names = FALSE}. If the database supports identifiers with special characters, the columns in the returned data frame are converted to valid R identifiers if the \code{check.names} argument is \code{TRUE}, If \code{check.names = FALSE}, the returned table has non-syntactic column names without quotes. } \description{ Reads a database table to a data frame, optionally converting a column to row names and converting the column names to valid R identifiers. Use \code{\link[=dbReadTableArrow]{dbReadTableArrow()}} instead to obtain an Arrow object. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbReadTable")} } \details{ This function returns a data frame. Use \code{\link[=dbReadTableArrow]{dbReadTableArrow()}} to obtain an Arrow object. } \section{Failure modes}{ An error is raised if the table does not exist. An error is raised if \code{row.names} is \code{TRUE} and no "row_names" column exists, An error is raised if \code{row.names} is set to a string and no corresponding column exists. An error is raised when calling this method for a closed or invalid connection. An error is raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Unsupported values for \code{row.names} and \code{check.names} (non-scalars, unsupported data types, \code{NA} for \code{check.names}) also raise an error. } \section{Additional arguments}{ The following arguments are not part of the \code{dbReadTable()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{row.names} (default: \code{FALSE}) \item \code{check.names} } They must be provided as named arguments. See the "Value" section for details on their usage. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbReadTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:10, ]) dbReadTable(con, "mtcars") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/sqlInterpolate.Rd0000644000176200001440000000643615005150137014726 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sqlInterpolate.R \name{sqlInterpolate} \alias{sqlInterpolate} \title{Safely interpolate values into an SQL string} \usage{ sqlInterpolate(conn, sql, ..., .dots = list()) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{sql}{A SQL string containing variables to interpolate. Variables must start with a question mark and can be any valid R identifier, i.e. it must start with a letter or \code{.}, and be followed by a letter, digit, \code{.} or \verb{_}.} \item{..., .dots}{Values (for \code{...}) or a list (for \code{.dots}) to interpolate into a string. Names are required if \code{sql} uses the \code{?name} syntax for placeholders. All values will be first escaped with \code{\link[=dbQuoteLiteral]{dbQuoteLiteral()}} prior to interpolation to protect against SQL injection attacks. Arguments created by \code{\link[=SQL]{SQL()}} or \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} remain unchanged.} } \value{ The \code{sql} query with the values from \code{...} and \code{.dots} safely embedded. } \description{ Accepts a query string with placeholders for values, and returns a string with the values embedded. The function is careful to quote all of its inputs with \code{\link[=dbQuoteLiteral]{dbQuoteLiteral()}} to protect against SQL injection attacks. Placeholders can be specified with one of two syntaxes: \itemize{ \item \verb{?}: each occurrence of a standalone \verb{?} is replaced with a value \item \code{?name1}, \code{?name2}, ...: values are given as named arguments or a named list, the names are used to match the values } Mixing \verb{?} and \code{?name} syntaxes is an error. The number and names of values supplied must correspond to the placeholders used in the query. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("sqlInterpolate")} } \section{Backend authors}{ If you are implementing an SQL backend with non-ANSI quoting rules, you'll need to implement a method for \code{\link[=sqlParseVariables]{sqlParseVariables()}}. Failure to do so does not expose you to SQL injection attacks, but will (rarely) result in errors matching supplied and interpolated variables. } \examples{ sql <- "SELECT * FROM X WHERE name = ?name" sqlInterpolate(ANSI(), sql, name = "Hadley") # This is safe because the single quote has been double escaped sqlInterpolate(ANSI(), sql, name = "H'); DROP TABLE--;") # Using paste0() could lead to dangerous SQL with carefully crafted inputs # (SQL injection) name <- "H'); DROP TABLE--;" paste0("SELECT * FROM X WHERE name = '", name, "'") # Use SQL() or dbQuoteIdentifier() to avoid escaping sql2 <- "SELECT * FROM ?table WHERE name in ?names" sqlInterpolate(ANSI(), sql2, table = dbQuoteIdentifier(ANSI(), "X"), names = SQL("('a', 'b')") ) # Don't use SQL() to escape identifiers to avoid SQL injection sqlInterpolate(ANSI(), sql2, table = SQL("X; DELETE FROM X; SELECT * FROM X"), names = SQL("('a', 'b')") ) # Use dbGetQuery() or dbExecute() to process these queries: if (requireNamespace("RSQLite", quietly = TRUE)) { con <- dbConnect(RSQLite::SQLite()) sql <- "SELECT ?value AS value" query <- sqlInterpolate(con, sql, value = 3) print(dbGetQuery(con, query)) dbDisconnect(con) } } DBI/man/dbIsReadOnly.Rd0000644000176200001440000000464314602466070014245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbIsReadOnly.R \name{dbIsReadOnly} \alias{dbIsReadOnly} \title{Is this DBMS object read only?} \usage{ dbIsReadOnly(dbObj, ...) } \arguments{ \item{dbObj}{An object inheriting from \linkS4class{DBIObject}, i.e. \linkS4class{DBIDriver}, \linkS4class{DBIConnection}, or a \linkS4class{DBIResult}} \item{...}{Other arguments to methods.} } \description{ This generic tests whether a database object is read only. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbIsReadOnly")} } \examples{ dbIsReadOnly(ANSI()) } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other DBIConnector generics: \code{\link{DBIConnector-class}}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbGetConnectArgs}()} } \concept{DBIConnection generics} \concept{DBIConnector generics} \concept{DBIDriver generics} \concept{DBIResult generics} DBI/man/dbBind.Rd0000644000176200001440000004007415005323731013100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/15-dbBind.R, R/25-dbBindArrow.R \name{dbBind} \alias{dbBind} \alias{dbBindArrow} \title{Bind values to a parameterized/prepared statement} \usage{ dbBind(res, params, ...) dbBindArrow(res, params, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{params}{For \code{dbBind()}, a list of values, named or unnamed, or a data frame, with one element/column per query parameter. For \code{dbBindArrow()}, values as a nanoarrow stream, with one column per query parameter.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbBind()} returns the result set, invisibly, for queries issued by \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}} or \code{\link[DBI:dbSendQueryArrow]{DBI::dbSendQueryArrow()}} and also for data manipulation statements issued by \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}. } \description{ For parametrized or prepared statements, the \code{\link[=dbSendQuery]{dbSendQuery()}}, \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}}, and \code{\link[=dbSendStatement]{dbSendStatement()}} functions can be called with statements that contain placeholders for values. The \code{dbBind()} and \code{dbBindArrow()} functions bind these placeholders to actual values, and are intended to be called on the result set before calling \code{\link[=dbFetch]{dbFetch()}} or \code{\link[=dbFetchArrow]{dbFetchArrow()}}. The values are passed to \code{dbBind()} as lists or data frames, and to \code{dbBindArrow()} as a stream created by \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}}. \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} \code{dbBindArrow()} is experimental, as are the other \verb{*Arrow} functions. \code{dbSendQuery()} is compatible with \code{dbBindArrow()}, and \code{dbSendQueryArrow()} is compatible with \code{dbBind()}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbBind")} } \details{ \pkg{DBI} supports parametrized (or prepared) queries and statements via the \code{dbBind()} and \code{dbBindArrow()} generics. Parametrized queries are different from normal queries in that they allow an arbitrary number of placeholders, which are later substituted by actual values. Parametrized queries (and statements) serve two purposes: \itemize{ \item The same query can be executed more than once with different values. The DBMS may cache intermediate information for the query, such as the execution plan, and execute it faster. \item Separation of query syntax and parameters protects against SQL injection. } The placeholder format is currently not specified by \pkg{DBI}; in the future, a uniform placeholder syntax may be supported. Consult the backend documentation for the supported formats. For automated testing, backend authors specify the placeholder syntax with the \code{placeholder_pattern} tweak. Known examples are: \itemize{ \item \verb{?} (positional matching in order of appearance) in \pkg{RMariaDB} and \pkg{RSQLite} \item \verb{$1} (positional matching by index) in \pkg{RPostgres} and \pkg{RSQLite} \item \verb{:name} and \verb{$name} (named matching) in \pkg{RSQLite} } } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{The data retrieval flow for Arrow streams}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}, is implemented by \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}} to create a result set object of class \linkS4class{DBIResultArrow}. \item Optionally, bind query parameters with \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Use \code{\link[=dbFetchArrow]{dbFetchArrow()}} to get a data stream. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{The command execution flow}{ This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbExecute]{dbExecute()}}, which should be sufficient for non-parameterized queries. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendStatement]{dbSendStatement()}} to create a result set object of class \linkS4class{DBIResult}. For some queries you need to pass \code{immediate = TRUE}. \item Optionally, bind query parameters with\code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}} to retrieve the number of rows affected by the query. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ Calling \code{dbBind()} for a query without parameters raises an error. Binding too many or not enough values, or parameters with wrong names or unequal length, also raises an error. If the placeholders in the query are named, all parameter values must have names (which must not be empty or \code{NA}), and vice versa, otherwise an error is raised. The behavior for mixing placeholders of different types (in particular mixing positional and named placeholders) is not specified. Calling \code{dbBind()} on a result set already cleared by \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} also raises an error. } \section{Specification}{ \pkg{DBI} clients execute parametrized statements as follows: \enumerate{ \item Call \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}}, \code{\link[DBI:dbSendQueryArrow]{DBI::dbSendQueryArrow()}} or \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}} with a query or statement that contains placeholders, store the returned \link[DBI:DBIResult-class]{DBI::DBIResult} object in a variable. Mixing placeholders (in particular, named and unnamed ones) is not recommended. It is good practice to register a call to \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} via \code{\link[=on.exit]{on.exit()}} right after calling \code{dbSendQuery()} or \code{dbSendStatement()} (see the last enumeration item). Until \code{\link[DBI:dbBind]{DBI::dbBind()}} or \code{\link[DBI:dbBind]{DBI::dbBindArrow()}} have been called, the returned result set object has the following behavior: \itemize{ \item \code{\link[DBI:dbFetch]{DBI::dbFetch()}} raises an error (for \code{dbSendQuery()} and \code{dbSendQueryArrow()}) \item \code{\link[DBI:dbGetRowCount]{DBI::dbGetRowCount()}} returns zero (for \code{dbSendQuery()} and \code{dbSendQueryArrow()}) \item \code{\link[DBI:dbGetRowsAffected]{DBI::dbGetRowsAffected()}} returns an integer \code{NA} (for \code{dbSendStatement()}) \item \code{\link[DBI:dbIsValid]{DBI::dbIsValid()}} returns \code{TRUE} \item \code{\link[DBI:dbHasCompleted]{DBI::dbHasCompleted()}} returns \code{FALSE} } \item Call \code{\link[DBI:dbBind]{DBI::dbBind()}} or \code{\link[DBI:dbBind]{DBI::dbBindArrow()}}: \itemize{ \item For \code{\link[DBI:dbBind]{DBI::dbBind()}}, the \code{params} argument must be a list where all elements have the same lengths and contain values supported by the backend. A \link{data.frame} is internally stored as such a list. \item For \code{\link[DBI:dbBind]{DBI::dbBindArrow()}}, the \code{params} argument must be a nanoarrow array stream, with one column per query parameter. } \item Retrieve the data or the number of affected rows from the \code{DBIResult} object. \itemize{ \item For queries issued by \code{dbSendQuery()} or \code{dbSendQueryArrow()}, call \code{\link[DBI:dbFetch]{DBI::dbFetch()}}. \item For statements issued by \code{dbSendStatements()}, call \code{\link[DBI:dbGetRowsAffected]{DBI::dbGetRowsAffected()}}. (Execution begins immediately after the \code{\link[DBI:dbBind]{DBI::dbBind()}} call, the statement is processed entirely before the function returns.) } \item Repeat 2. and 3. as necessary. \item Close the result set via \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. } The elements of the \code{params} argument do not need to be scalars, vectors of arbitrary length (including length 0) are supported. For queries, calling \code{dbFetch()} binding such parameters returns concatenated results, equivalent to binding and fetching for each set of values and connecting via \code{\link[=rbind]{rbind()}}. For data manipulation statements, \code{dbGetRowsAffected()} returns the total number of rows affected if binding non-scalar parameters. \code{dbBind()} also accepts repeated calls on the same result set for both queries and data manipulation statements, even if no results are fetched between calls to \code{dbBind()}, for both queries and data manipulation statements. If the placeholders in the query are named, their order in the \code{params} argument is not important. At least the following data types are accepted on input (including \link{NA}): \itemize{ \item \link{integer} \item \link{numeric} \item \link{logical} for Boolean values \item \link{character} (also with special characters such as spaces, newlines, quotes, and backslashes) \item \link{factor} (bound as character, with warning) \item \link[=Dates]{Date} (also when stored internally as integer) \item \link[=DateTimeClasses]{POSIXct} timestamps \item \link{POSIXlt} timestamps \item \link{difftime} values (also with units other than seconds and with the value stored as integer) \item lists of \link{raw} for blobs (with \code{NULL} entries for SQL NULL values) \item objects of type \link[blob:blob]{blob::blob} } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Data frame flow: con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "iris", iris) # Using the same query for different values iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") dbBind(iris_result, list(2.3)) dbFetch(iris_result) dbBind(iris_result, list(3)) dbFetch(iris_result) dbClearResult(iris_result) # Executing the same statement with different values at once iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = $species") dbBind(iris_result, list(species = c("setosa", "versicolor", "unknown"))) dbGetRowsAffected(iris_result) dbClearResult(iris_result) nrow(dbReadTable(con, "iris")) dbDisconnect(con) \dontshow{\}) # examplesIf} \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Arrow flow: con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "iris", iris) # Using the same query for different values iris_result <- dbSendQueryArrow(con, "SELECT * FROM iris WHERE [Petal.Width] > ?") dbBindArrow( iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame(2.3, fix.empty.names = FALSE)) ) as.data.frame(dbFetchArrow(iris_result)) dbBindArrow( iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame(3, fix.empty.names = FALSE)) ) as.data.frame(dbFetchArrow(iris_result)) dbClearResult(iris_result) # Executing the same statement with different values at once iris_result <- dbSendStatement(con, "DELETE FROM iris WHERE [Species] = $species") dbBindArrow(iris_result, nanoarrow::as_nanoarrow_array_stream(data.frame( species = c("setosa", "versicolor", "unknown") ))) dbGetRowsAffected(iris_result) dbClearResult(iris_result) nrow(dbReadTable(con, "iris")) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()} Other data retrieval generics: \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} Other command execution generics: \code{\link{dbClearResult}()}, \code{\link{dbExecute}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbSendStatement}()} } \concept{DBIResult generics} \concept{DBIResultArrow generics} \concept{command execution generics} \concept{data retrieval generics} DBI/man/dbFetchArrowChunk.Rd0000644000176200001440000001043415005323731015256 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbFetchArrowChunk.R \name{dbFetchArrowChunk} \alias{dbFetchArrowChunk} \title{Fetch the next batch of records from a previously executed query as an Arrow object} \usage{ dbFetchArrowChunk(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResultArrow-class]{DBI::DBIResultArrow}, created by \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbFetchArrowChunk()} always returns an object coercible to a \link{data.frame} with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Fetch the next chunk of the result set and return it as an Arrow object. The chunk size is implementation-specific. Use \code{\link[=dbFetchArrow]{dbFetchArrow()}} to fetch all results. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbFetchArrowChunk")} } \section{The data retrieval flow for Arrow streams}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}, is implemented by \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}} to create a result set object of class \linkS4class{DBIResultArrow}. \item Optionally, bind query parameters with \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Use \code{\link[=dbFetchArrow]{dbFetchArrow()}} to get a data stream. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An attempt to fetch from a closed result set raises an error. } \section{Specification}{ Fetching multi-row queries with one or more columns returns the next chunk. The size of the chunk is implementation-specific. The object returned by \code{dbFetchArrowChunk()} can also be passed to \code{\link[nanoarrow:as_nanoarrow_array]{nanoarrow::as_nanoarrow_array()}} to create a nanoarrow array object. The chunk size is implementation-specific. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") dbHasCompleted(rs) as.data.frame(dbFetchArrowChunk(rs)) dbHasCompleted(rs) as.data.frame(dbFetchArrowChunk(rs)) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Close the result set with \code{\link[=dbClearResult]{dbClearResult()}} as soon as you finish retrieving the records you want. Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIResultArrow generics} \concept{data retrieval generics} DBI/man/dbRemoveTable.Rd0000644000176200001440000001037715005323731014434 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbRemoveTable.R \name{dbRemoveTable} \alias{dbRemoveTable} \title{Remove a table from the database} \usage{ dbRemoveTable(conn, name, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbRemoveTable()} returns \code{TRUE}, invisibly. } \description{ Remove a remote table (e.g., created by \code{\link[=dbWriteTable]{dbWriteTable()}}) from the database. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbRemoveTable")} } \section{Failure modes}{ If the table does not exist, an error is raised. An attempt to remove a view with this function may result in an error. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. } \section{Additional arguments}{ The following arguments are not part of the \code{dbRemoveTable()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{temporary} (default: \code{FALSE}) \item \code{fail_if_missing} (default: \code{TRUE}) } These arguments must be provided as named arguments. If \code{temporary} is \code{TRUE}, the call to \code{dbRemoveTable()} will consider only temporary tables. Not all backends support this argument. In particular, permanent tables of the same name are left untouched. If \code{fail_if_missing} is \code{FALSE}, the call to \code{dbRemoveTable()} succeeds if the table does not exist. } \section{Specification}{ A table removed by \code{dbRemoveTable()} doesn't appear in the list of tables returned by \code{\link[DBI:dbListTables]{DBI::dbListTables()}}, and \code{\link[DBI:dbExistsTable]{DBI::dbExistsTable()}} returns \code{FALSE}. The removal propagates immediately to other connections to the same database. This function can also be used to remove a temporary table. The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbRemoveTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbExistsTable(con, "iris") dbWriteTable(con, "iris", iris) dbExistsTable(con, "iris") dbRemoveTable(con, "iris") dbExistsTable(con, "iris") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbListResults.Rd0000644000176200001440000000320415005150137014511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbListResults.R \name{dbListResults} \alias{dbListResults} \title{A list of all pending results} \usage{ dbListResults(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \value{ a list. If no results are active, an empty list. If only a single result is active, a list with one element. } \description{ DEPRECATED. DBI currenty supports only one open result set per connection, you need to keep track of the result sets you open if you need this functionality. } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} \keyword{internal} DBI/man/make.db.names.Rd0000644000176200001440000000671014350241735014325 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R, R/isSQLKeyword.R, % R/make.db.names.R \name{make.db.names.default} \alias{make.db.names.default} \alias{isSQLKeyword.default} \alias{isSQLKeyword} \alias{make.db.names} \alias{SQLKeywords} \title{Make R identifiers into legal SQL identifiers} \usage{ make.db.names.default( snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE ) isSQLKeyword.default( name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3] ) isSQLKeyword( dbObj, name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3], ... ) make.db.names( dbObj, snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE, ... ) } \arguments{ \item{snames}{a character vector of R identifiers (symbols) from which we need to make SQL identifiers.} \item{keywords}{a character vector with SQL keywords, by default it's \code{.SQL92Keywords} defined by the DBI.} \item{unique}{logical describing whether the resulting set of SQL names should be unique. Its default is \code{TRUE}. Following the SQL 92 standard, uniqueness of SQL identifiers is determined regardless of whether letters are upper or lower case.} \item{allow.keywords}{logical describing whether SQL keywords should be allowed in the resulting set of SQL names. Its default is \code{TRUE}} \item{name}{a character vector with database identifier candidates we need to determine whether they are legal SQL identifiers or not.} \item{case}{a character string specifying whether to make the comparison as lower case, upper case, or any of the two. it defaults to \code{any}.} \item{dbObj}{any DBI object (e.g., \code{DBIDriver}).} \item{\dots}{any other argument are passed to the driver implementation.} } \value{ \code{make.db.names} returns a character vector of legal SQL identifiers corresponding to its \code{snames} argument. \code{SQLKeywords} returns a character vector of all known keywords for the database-engine associated with \code{dbObj}. \code{isSQLKeyword} returns a logical vector parallel to \code{name}. } \description{ These methods are DEPRECATED. Please use \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} (or possibly \code{\link[=dbQuoteString]{dbQuoteString()}}) instead. } \details{ The algorithm in \code{make.db.names} first invokes \code{make.names} and then replaces each occurrence of a dot \code{.} by an underscore \verb{_}. If \code{allow.keywords} is \code{FALSE} and identifiers collide with SQL keywords, a small integer is appended to the identifier in the form of \code{"_n"}. The set of SQL keywords is stored in the character vector \code{.SQL92Keywords} and reflects the SQL ANSI/ISO standard as documented in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily override or update this vector. } \section{Bugs}{ The current mapping is not guaranteed to be fully reversible: some SQL identifiers that get mapped into R identifiers with \code{make.names} and then back to SQL with \code{\link[=make.db.names]{make.db.names()}} will not be equal to the original SQL identifiers (e.g., compound SQL identifiers of the form \code{username.tablename} will loose the dot ``.''). } \references{ The set of SQL keywords is stored in the character vector \code{.SQL92Keywords} and reflects the SQL ANSI/ISO standard as documented in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily override or update this vector. } \keyword{internal} DBI/man/DBIObject-class.Rd0000644000176200001440000000342615005150137014544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/01-DBIObject.R \docType{class} \name{DBIObject-class} \alias{DBIObject-class} \title{DBIObject class} \description{ Base class for all other DBI classes (e.g., drivers, connections). This is a virtual Class: No objects may be created from it. } \details{ More generally, the DBI defines a very small set of classes and generics that allows users and applications access DBMS with a common interface. The virtual classes are \code{DBIDriver} that individual drivers extend, \code{DBIConnection} that represent instances of DBMS connections, and \code{DBIResult} that represent the result of a DBMS statement. These three classes extend the basic class of \code{DBIObject}, which serves as the root or parent of the class hierarchy. } \section{Implementation notes}{ An implementation MUST provide methods for the following generics: \itemize{ \item \code{\link[=dbGetInfo]{dbGetInfo()}}. } It MAY also provide methods for: \itemize{ \item \code{\link[=summary]{summary()}}. Print a concise description of the object. The default method invokes \code{dbGetInfo(dbObj)} and prints the name-value pairs one per line. Individual implementations may tailor this appropriately. } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} drv <- RSQLite::SQLite() con <- dbConnect(drv) rs <- dbSendQuery(con, "SELECT 1") is(drv, "DBIObject") ## True is(con, "DBIObject") ## True is(rs, "DBIObject") dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBI classes: \code{\link{DBIConnection-class}}, \code{\link{DBIConnector-class}}, \code{\link{DBIDriver-class}}, \code{\link{DBIResult-class}}, \code{\link{DBIResultArrow-class}} } \concept{DBI classes} DBI/man/dbSendQuery.Rd0000644000176200001440000002221315005323731014136 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/14-dbSendQuery.R \name{dbSendQuery} \alias{dbSendQuery} \title{Execute a query on a given database connection} \usage{ dbSendQuery(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbSendQuery()} returns an S4 object that inherits from \link[DBI:DBIResult-class]{DBI::DBIResult}. The result set can be used with \code{\link[DBI:dbFetch]{DBI::dbFetch()}} to extract records. Once you have finished using a result, make sure to clear it with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. } \description{ The \code{dbSendQuery()} method only submits and synchronously executes the SQL query to the database engine. It does \emph{not} extract any records --- for that you need to use the \code{\link[=dbFetch]{dbFetch()}} method, and then you must call \code{\link[=dbClearResult]{dbClearResult()}} when you finish fetching the records you need. For interactive use, you should almost always prefer \code{\link[=dbGetQuery]{dbGetQuery()}}. Use \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}} or \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}} instead to retrieve the results as an Arrow object. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendQuery")} } \details{ This method is for \code{SELECT} queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use \code{\link[=dbSendStatement]{dbSendStatement()}} for data manipulation statements. The query is submitted to the database server and the DBMS executes it, possibly generating vast amounts of data. Where these data live is driver-specific: some drivers may choose to leave the output on the server and transfer them piecemeal to R, others may transfer all the data to the client -- but not necessarily to the memory that R manages. See individual drivers' \code{dbSendQuery()} documentation for details. } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-\code{NA} string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the \code{params} argument) or the \code{immediate} argument is set to \code{TRUE}. } \section{Additional arguments}{ The following arguments are not part of the \code{dbSendQuery()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" sections for details on their usage. } \section{Specification}{ No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with \code{dbClearResult()}. The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(rs) dbClearResult(rs) # Pass one set of values with the param argument: rs <- dbSendQuery( con, "SELECT * FROM mtcars WHERE cyl = ?", params = list(4L) ) dbFetch(rs) dbClearResult(rs) # Pass multiple sets of values with dbBind(): rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = ?") dbBind(rs, list(6L)) dbFetch(rs) dbBind(rs, list(8L)) dbFetch(rs) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For updates: \code{\link[=dbSendStatement]{dbSendStatement()}} and \code{\link[=dbExecute]{dbExecute()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIConnection generics} \concept{data retrieval generics} DBI/man/DBIResult-class.Rd0000644000176200001440000000257214602466070014625 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/04-DBIResult.R \docType{class} \name{DBIResult-class} \alias{DBIResult-class} \title{DBIResult class} \description{ This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query). The result set keeps track of whether the statement produces output how many rows were affected by the operation, how many rows have been fetched (if statement is a query), whether there are more rows to fetch, etc. } \section{Implementation notes}{ Individual drivers are free to allow single or multiple active results per connection. The default show method displays a summary of the query using other DBI generics. } \seealso{ Other DBI classes: \code{\link{DBIConnection-class}}, \code{\link{DBIConnector-class}}, \code{\link{DBIDriver-class}}, \code{\link{DBIObject-class}}, \code{\link{DBIResultArrow-class}} Other DBIResult generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} } \concept{DBI classes} \concept{DBIResult generics} DBI/man/dbUnquoteIdentifier.Rd0000644000176200001440000000744115005323731015670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbUnquoteIdentifier.R \name{dbUnquoteIdentifier} \alias{dbUnquoteIdentifier} \title{Unquote identifiers} \usage{ dbUnquoteIdentifier(conn, x, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{x}{An \link{SQL} or \link{Id} object.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbUnquoteIdentifier()} returns a list of objects of the same length as the input. For an empty vector, this function returns a length-0 object. The names of the input argument are preserved in the output. If \code{x} is a value returned by \code{dbUnquoteIdentifier()}, calling \code{dbUnquoteIdentifier(..., dbQuoteIdentifier(..., x))} returns \code{list(x)}. If \code{x} is an object of class \link[DBI:Id]{DBI::Id}, calling \code{dbUnquoteIdentifier(..., x)} returns \code{list(x)}. (For backends it may be most convenient to return \link[DBI:Id]{DBI::Id} objects to achieve this behavior, but this is not required.) Plain character vectors can also be passed to \code{dbUnquoteIdentifier()}. } \description{ Call this method to convert a \link{SQL} object created by \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} back to a list of \link{Id} objects. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbUnquoteIdentifier")} } \section{Failure modes}{ An error is raised if a character vectors with a missing value is passed as the \code{x} argument. } \section{Specification}{ For any character vector of length one, quoting (with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}) then unquoting then quoting the first element is identical to just quoting. This is also true for strings that contain special characters such as a space, a dot, a comma, or quotes used to mark strings or identifiers, if the database supports this. Unquoting simple strings (consisting of only letters) wrapped with \code{\link[DBI:SQL]{DBI::SQL()}} and then quoting via \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} gives the same result as just quoting the string. Similarly, unquoting expressions of the form \code{SQL("schema.table")} and then quoting gives the same result as quoting the identifier constructed by \code{Id("schema", "table")}. } \examples{ # Unquoting allows to understand the structure of a # possibly complex quoted identifier dbUnquoteIdentifier( ANSI(), SQL(c('"Catalog"."Schema"."Table"', '"Schema"."Table"', '"UnqualifiedTable"')) ) # The returned object is always a list, # also for Id objects dbUnquoteIdentifier(ANSI(), Id("Catalog", "Schema", "Table")) # Quoting and unquoting are inverses dbQuoteIdentifier( ANSI(), dbUnquoteIdentifier(ANSI(), SQL("UnqualifiedTable"))[[1]] ) dbQuoteIdentifier( ANSI(), dbUnquoteIdentifier(ANSI(), Id("Schema", "Table"))[[1]] ) } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbCreateTableArrow.Rd0000644000176200001440000001232315005323731015406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/22-dbCreateTableArrow.R \name{dbCreateTableArrow} \alias{dbCreateTableArrow} \title{Create a table in the database based on an Arrow object} \usage{ dbCreateTableArrow(conn, name, value, ..., temporary = FALSE) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{value}{An object for which a schema can be determined via \code{\link[nanoarrow:as_nanoarrow_schema]{nanoarrow::infer_nanoarrow_schema()}}.} \item{...}{Other parameters passed on to methods.} \item{temporary}{If \code{TRUE}, will generate a temporary table.} } \value{ \code{dbCreateTableArrow()} returns \code{TRUE}, invisibly. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} The default \code{dbCreateTableArrow()} method determines the R data types of the Arrow schema associated with the Arrow object, and calls \code{\link[=dbCreateTable]{dbCreateTable()}}. Backends that implement \code{\link[=dbAppendTableArrow]{dbAppendTableArrow()}} should typically also implement this generic. Use \code{\link[=dbCreateTable]{dbCreateTable()}} to create a table from the column types as defined in a data frame. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbCreateTableArrow")} } \section{Failure modes}{ If the table exists, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Invalid values for the \code{temporary} argument (non-scalars, unsupported data types, \code{NA}, incompatible values, duplicate names) also raise an error. } \section{Additional arguments}{ The following arguments are not part of the \code{dbCreateTableArrow()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{temporary} (default: \code{FALSE}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbCreateTableArrow()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } The \code{value} argument can be: \itemize{ \item a data frame, \item a nanoarrow array \item a nanoarrow array stream (which will still contain the data after the call) \item a nanoarrow schema } If the \code{temporary} argument is \code{TRUE}, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") ptype <- data.frame(a = numeric()) dbCreateTableArrow(con, "df", nanoarrow::infer_nanoarrow_schema(ptype)) dbReadTable(con, "df") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbListTables.Rd0000644000176200001440000000466115005323731014274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbListTables.R \name{dbListTables} \alias{dbListTables} \title{List remote tables} \usage{ dbListTables(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbListTables()} returns a character vector that enumerates all tables and views in the database. Tables added with \code{\link[DBI:dbWriteTable]{DBI::dbWriteTable()}} are part of the list. As soon a table is removed from the database, it is also removed from the list of database tables. The same applies to temporary tables if supported by the database. The returned names are suitable for quoting with \code{dbQuoteIdentifier()}. } \description{ Returns the unquoted names of remote tables accessible through this connection. This should include views and temporary objects, but not all database backends (in particular \pkg{RMariaDB} and \pkg{RMySQL}) support this. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbListTables")} } \section{Failure modes}{ An error is raised when calling this method for a closed or invalid connection. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbListTables(con) dbWriteTable(con, "mtcars", mtcars) dbListTables(con) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/Id.Rd0000644000176200001440000000315014602466070012252 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/00-Id.R \docType{class} \name{Id-class} \alias{Id-class} \alias{Id} \title{Refer to a table nested in a hierarchy (e.g. within a schema)} \usage{ Id(...) } \arguments{ \item{...}{Components of the hierarchy, e.g. \code{cluster}, \code{catalog}, \code{schema}, or \code{table}, depending on the database backend. For more on these concepts, see \url{https://stackoverflow.com/questions/7022755/}} } \description{ Objects of class \code{Id} have a single slot \code{name}, which is a character vector. The \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} method converts \code{Id} objects to strings. Support for \code{Id} objects depends on the database backend. They can be used in the following methods as \code{name} or \code{table} argument: \itemize{ \item \code{\link[=dbCreateTable]{dbCreateTable()}} \item \code{\link[=dbAppendTable]{dbAppendTable()}} \item \code{\link[=dbReadTable]{dbReadTable()}} \item \code{\link[=dbWriteTable]{dbWriteTable()}} \item \code{\link[=dbExistsTable]{dbExistsTable()}} \item \code{\link[=dbRemoveTable]{dbRemoveTable()}} } Objects of this class are also returned from \code{\link[=dbListObjects]{dbListObjects()}}. } \examples{ # Identifies a table in a specific schema: Id("dbo", "Customer") # You can name the components if you want, but it's not needed Id(table = "Customer", schema = "dbo") # Create a SQL expression for an identifier: dbQuoteIdentifier(ANSI(), Id("nycflights13", "flights")) # Write a table in a specific schema: \dontrun{ dbWriteTable(con, Id("myschema", "mytable"), data.frame(a = 1)) } } DBI/man/dbCreateTable.Rd0000644000176200001440000001305115005323731014372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/12-dbCreateTable.R \name{dbCreateTable} \alias{dbCreateTable} \title{Create a table in the database} \usage{ dbCreateTable(conn, name, fields, ..., row.names = NULL, temporary = FALSE) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{fields}{Either a character vector or a data frame. A named character vector: Names are column names, values are types. Names are escaped with \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Field types are unescaped. A data frame: field types are generated using \code{\link[=dbDataType]{dbDataType()}}.} \item{...}{Other parameters passed on to methods.} \item{row.names}{Must be \code{NULL}.} \item{temporary}{If \code{TRUE}, will generate a temporary table.} } \value{ \code{dbCreateTable()} returns \code{TRUE}, invisibly. } \description{ The default \code{dbCreateTable()} method calls \code{\link[=sqlCreateTable]{sqlCreateTable()}} and \code{\link[=dbExecute]{dbExecute()}}. Use \code{\link[=dbCreateTableArrow]{dbCreateTableArrow()}} to create a table from an Arrow schema. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbCreateTable")} } \details{ Backends compliant to ANSI SQL 99 don't need to override it. Backends with a different SQL syntax can override \code{sqlCreateTable()}, backends with entirely different ways to create tables need to override this method. The \code{row.names} argument is not supported by this method. Process the values with \code{\link[=sqlRownamesToColumn]{sqlRownamesToColumn()}} before calling this method. The argument order is different from the \code{sqlCreateTable()} method, the latter will be adapted in a later release of DBI. } \section{Failure modes}{ If the table exists, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Invalid values for the \code{row.names} and \code{temporary} arguments (non-scalars, unsupported data types, \code{NA}, incompatible values, duplicate names) also raise an error. } \section{Additional arguments}{ The following arguments are not part of the \code{dbCreateTable()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{temporary} (default: \code{FALSE}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbCreateTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } The \code{value} argument can be: \itemize{ \item a data frame, \item a named list of SQL types } If the \code{temporary} argument is \code{TRUE}, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, and spaces can also be used for table names and column names, if the database supports non-syntactic identifiers. The \code{row.names} argument must be missing or \code{NULL}, the default value. All other values for the \code{row.names} argument (in particular \code{TRUE}, \code{NA}, and a string) raise an error. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTable(con, "iris", iris) dbReadTable(con, "iris") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbHasCompleted.Rd0000644000176200001440000001217015005323731014570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbHasCompleted.R \name{dbHasCompleted} \alias{dbHasCompleted} \title{Completion status} \usage{ dbHasCompleted(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbHasCompleted()} returns a logical scalar. For a query initiated by \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}} with non-empty result set, \code{dbHasCompleted()} returns \code{FALSE} initially and \code{TRUE} after calling \code{\link[DBI:dbFetch]{DBI::dbFetch()}} without limit. For a query initiated by \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}, \code{dbHasCompleted()} always returns \code{TRUE}. } \description{ This method returns if the operation has completed. A \code{SELECT} query is completed if all rows have been fetched. A data manipulation statement is always completed. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbHasCompleted")} } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ Attempting to query completion status for a result set cleared with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} gives an error. } \section{Specification}{ The completion status for a query is only guaranteed to be set to \code{FALSE} after attempting to fetch past the end of the entire result. Therefore, for a query with an empty result set, the initial return value is unspecified, but the result value is \code{TRUE} after trying to fetch only one row. Similarly, for a query with a result set of length n, the return value is unspecified after fetching n rows, but the result value is \code{TRUE} after trying to fetch only one more row. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbHasCompleted(rs) ret1 <- dbFetch(rs, 10) dbHasCompleted(rs) ret2 <- dbFetch(rs) dbHasCompleted(rs) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbIsValid}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIResult generics} \concept{DBIResultArrow generics} \concept{data retrieval generics} DBI/man/dbDriver.Rd0000644000176200001440000000464215005150137013456 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbDriver.R, R/dbUnloadDriver.R \name{dbDriver} \alias{dbDriver} \alias{dbUnloadDriver} \title{Load and unload database drivers} \usage{ dbDriver(drvName, ...) dbUnloadDriver(drv, ...) } \arguments{ \item{drvName}{character name of the driver to instantiate.} \item{...}{any other arguments are passed to the driver \code{drvName}.} \item{drv}{an object that inherits from \code{DBIDriver} as created by \code{dbDriver}.} } \value{ In the case of \code{dbDriver}, an driver object whose class extends \code{DBIDriver}. This object may be used to create connections to the actual DBMS engine. In the case of \code{dbUnloadDriver}, a logical indicating whether the operation succeeded or not. } \description{ These methods are deprecated, please consult the documentation of the individual backends for the construction of driver instances. \code{dbDriver()} is a helper method used to create an new driver object given the name of a database or the corresponding R package. It works through convention: all DBI-extending packages should provide an exported object with the same name as the package. \code{dbDriver()} just looks for this object in the right places: if you know what database you are connecting to, you should call the function directly. \code{dbUnloadDriver()} is not implemented for modern backends. } \details{ The client part of the database communication is initialized (typically dynamically loading C code, etc.) but note that connecting to the database engine itself needs to be done through calls to \code{dbConnect}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Create a RSQLite driver with a string d <- dbDriver("SQLite") d # But better, access the object directly RSQLite::SQLite() \dontshow{\}) # examplesIf} } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} } \concept{DBIDriver generics} \keyword{internal} DBI/man/SQL.Rd0000644000176200001440000000360414350241735012360 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/SQL.R \docType{class} \name{SQL} \alias{SQL} \alias{SQL-class} \title{SQL quoting} \usage{ SQL(x, ..., names = NULL) } \arguments{ \item{x}{A character vector to label as being escaped SQL.} \item{...}{Other arguments passed on to methods. Not otherwise used.} \item{names}{Names for the returned object, must have the same length as \code{x}.} } \value{ An object of class \code{SQL}. } \description{ This set of classes and generics make it possible to flexibly deal with SQL escaping needs. By default, any user supplied input to a query should be escaped using either \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}} or \code{\link[=dbQuoteString]{dbQuoteString()}} depending on whether it refers to a table or variable name, or is a literal string. These functions may return an object of the \code{SQL} class, which tells DBI functions that a character string does not need to be escaped anymore, to prevent double escaping. The \code{SQL} class has associated the \code{SQL()} constructor function. } \section{Implementation notes}{ DBI provides default generics for SQL-92 compatible quoting. If the database uses a different convention, you will need to provide your own methods. Note that because of the way that S4 dispatch finds methods and because SQL inherits from character, if you implement (e.g.) a method for \code{dbQuoteString(MyConnection, character)}, you will also need to implement \code{dbQuoteString(MyConnection, SQL)} - this should simply return \code{x} unchanged. } \examples{ dbQuoteIdentifier(ANSI(), "SELECT") dbQuoteString(ANSI(), "SELECT") # SQL vectors are always passed through as is var_name <- SQL("SELECT") var_name dbQuoteIdentifier(ANSI(), var_name) dbQuoteString(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteString(ANSI(), dbQuoteString(ANSI(), "SELECT")) } DBI/man/dbGetRowCount.Rd0000644000176200001440000000443115005323731014441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetRowCount.R \name{dbGetRowCount} \alias{dbGetRowCount} \title{The number of rows fetched so far} \usage{ dbGetRowCount(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbGetRowCount()} returns a scalar number (integer or numeric), the number of rows fetched so far. After calling \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}}, the row count is initially zero. After a call to \code{\link[DBI:dbFetch]{DBI::dbFetch()}} without limit, the row count matches the total number of rows returned. Fetching a limited number of rows increases the number of rows by the number of rows returned, even if fetching past the end of the result set. For queries with an empty result set, zero is returned even after fetching. For data manipulation statements issued with \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}, zero is returned before and after calling \code{dbFetch()}. } \description{ Returns the total number of rows actually fetched with calls to \code{\link[=dbFetch]{dbFetch()}} for this result set. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowCount")} } \section{Failure modes}{ Attempting to get the row count for a result set cleared with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} gives an error. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbGetRowCount(rs) ret1 <- dbFetch(rs, 10) dbGetRowCount(rs) ret2 <- dbFetch(rs) dbGetRowCount(rs) nrow(ret1) + nrow(ret2) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} } \concept{DBIResult generics} DBI/man/dbListFields.Rd0000644000176200001440000000637415005323731014273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbListFields.R \name{dbListFields} \alias{dbListFields} \title{List field names of a remote table} \usage{ dbListFields(conn, name, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbListFields()} returns a character vector that enumerates all fields in the table in the correct order. This also works for temporary tables if supported by the database. The returned names are suitable for quoting with \code{dbQuoteIdentifier()}. } \description{ Returns the field names of a remote table as a character vector. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbListFields")} } \section{Failure modes}{ If the table does not exist, an error is raised. Invalid types for the \code{name} argument (e.g., \code{character} of length not equal to one, or numeric) lead to an error. An error is also raised when calling this method for a closed or invalid connection. } \section{Specification}{ The \code{name} argument can be \itemize{ \item a string \item the return value of \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} \item a value from the \code{table} column from the return value of \code{\link[DBI:dbListObjects]{DBI::dbListObjects()}} where \code{is_prefix} is \code{FALSE} } A column named \code{row_names} is treated like any other column. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) dbListFields(con, "mtcars") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ \code{\link[=dbColumnInfo]{dbColumnInfo()}} to get the type of the fields. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/DBIConnection-class.Rd0000644000176200001440000000363715005150137015441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/03-DBIConnection.R \docType{class} \name{DBIConnection-class} \alias{DBIConnection-class} \title{DBIConnection class} \description{ This virtual class encapsulates the connection to a DBMS, and it provides access to dynamic queries, result sets, DBMS session management (transactions), etc. } \section{Implementation note}{ Individual drivers are free to implement single or multiple simultaneous connections. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") con dbDisconnect(con) \dontrun{ con <- dbConnect(RPostgreSQL::PostgreSQL(), "username", "password") con dbDisconnect(con) } \dontshow{\}) # examplesIf} } \seealso{ Other DBI classes: \code{\link{DBIConnector-class}}, \code{\link{DBIDriver-class}}, \code{\link{DBIObject-class}}, \code{\link{DBIResult-class}}, \code{\link{DBIResultArrow-class}} Other DBIConnection generics: \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBI classes} \concept{DBIConnection generics} DBI/man/dbGetDBIVersion.Rd0000644000176200001440000000045514350241735014634 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{dbGetDBIVersion} \alias{dbGetDBIVersion} \title{Determine the current version of the package.} \usage{ dbGetDBIVersion() } \description{ Determine the current version of the package. } \keyword{internal} DBI/man/DBIResultArrow-class.Rd0000644000176200001440000000234614602466070015637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/07-DBIResultArrow.R \docType{class} \name{DBIResultArrow-class} \alias{DBIResultArrow-class} \alias{DBIResultArrowDefault-class} \title{DBIResultArrow class} \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query) for returning data as an Arrow object. } \section{Implementation notes}{ Individual drivers are free to allow single or multiple active results per connection. The default show method displays a summary of the query using other DBI generics. } \seealso{ Other DBI classes: \code{\link{DBIConnection-class}}, \code{\link{DBIConnector-class}}, \code{\link{DBIDriver-class}}, \code{\link{DBIObject-class}}, \code{\link{DBIResult-class}} Other DBIResultArrow generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()} } \concept{DBI classes} \concept{DBIResultArrow generics} DBI/man/hidden_aliases.Rd0000644000176200001440000002737714602466070014673 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/06-ANSI.R, R/SQLKeywords_DBIObject.R, % R/SQLKeywords_missing.R, R/dbAppendTableArrow_DBIConnection.R, % R/dbAppendTable_DBIConnection.R, R/dbBindArrow_DBIResult.R, % R/dbBindArrow_DBIResultArrowDefault.R, R/dbBind_DBIResultArrow.R, % R/dbCanConnect_DBIDriver.R, R/dbClearResult_DBIResultArrow.R, % R/dbConnect_DBIConnector.R, R/dbCreateTableArrow_DBIConnection.R, % R/dbCreateTable_DBIConnection.R, R/dbDataType_DBIConnector.R, % R/dbDataType_DBIObject.R, R/dbDriver_character.R, % R/dbExecute_DBIConnection_character.R, R/dbExistsTable_DBIConnection_Id.R, % R/dbFetchArrowChunk_DBIResultArrow.R, R/dbFetchArrow_DBIResultArrow.R, % R/dbFetch_DBIResult.R, R/dbFetch_DBIResultArrow.R, % R/dbGetConnectArgs_DBIConnector.R, R/dbGetInfo_DBIResult.R, % R/dbGetInfo_DBIResultArrow.R, R/dbGetQueryArrow_DBIConnection.R, % R/dbGetQuery_DBIConnection_character.R, R/dbGetRowCount_DBIResultArrow.R, % R/dbGetRowsAffected_DBIResultArrow.R, R/dbGetStatement_DBIResultArrow.R, % R/dbHasCompleted_DBIResultArrow.R, R/dbIsReadOnly_DBIConnector.R, % R/dbIsReadOnly_DBIObject.R, R/dbIsValid_DBIResultArrowDefault.R, % R/dbListFields_DBIConnection_Id.R, R/dbListFields_DBIConnection_character.R, % R/dbListObjects_DBIConnection_ANY.R, R/dbQuoteIdentifier_DBIConnection.R, % R/dbQuoteLiteral_DBIConnection.R, R/dbQuoteString_DBIConnection.R, % R/dbReadTableArrow_DBIConnection.R, R/dbReadTable_DBIConnection_Id.R, % R/dbReadTable_DBIConnection_character.R, % R/dbRemoveTable_DBIConnection_Id.R, R/dbSendQueryArrow_DBIConnection.R, % R/dbSendStatement_DBIConnection_character.R, % R/dbUnquoteIdentifier_DBIConnection.R, R/dbWithTransaction_DBIConnection.R, % R/dbWriteTableArrow_DBIConnection.R, R/dbWriteTable_DBIConnection_Id_ANY.R, % R/isSQLKeyword_DBIObject_character.R, R/make.db.names_DBIObject_character.R, % R/show_AnsiConnection.R, R/show_DBIConnection.R, R/show_DBIConnector.R, % R/show_DBIDriver.R, R/show_DBIResult.R, R/show_Id.R, R/show_SQL.R, % R/sqlAppendTable_DBIConnection.R, R/sqlCreateTable_DBIConnection.R, % R/sqlData_DBIConnection.R, R/sqlInterpolate_DBIConnection.R, % R/sqlParseVariables_DBIConnection.R \docType{methods} \name{hidden_aliases} \alias{hidden_aliases} \alias{SQLKeywords_DBIObject} \alias{SQLKeywords,DBIObject-method} \alias{SQLKeywords_missing} \alias{SQLKeywords,missing-method} \alias{dbAppendTableArrow_DBIConnection} \alias{dbAppendTableArrow,DBIConnection-method} \alias{dbAppendTable_DBIConnection} \alias{dbAppendTable,DBIConnection-method} \alias{dbBindArrow_DBIResult} \alias{dbBindArrow,DBIResult-method} \alias{dbBindArrow_DBIResultArrowDefault} \alias{dbBindArrow,DBIResultArrowDefault-method} \alias{dbBind_DBIResultArrow} \alias{dbBind,DBIResultArrow-method} \alias{dbCanConnect_DBIDriver} \alias{dbCanConnect,DBIDriver-method} \alias{dbClearResult_DBIResultArrow} \alias{dbClearResult,DBIResultArrow-method} \alias{dbConnect_DBIConnector} \alias{dbConnect,DBIConnector-method} \alias{dbCreateTableArrow_DBIConnection} \alias{dbCreateTableArrow,DBIConnection-method} \alias{dbCreateTable_DBIConnection} \alias{dbCreateTable,DBIConnection-method} \alias{dbDataType_DBIConnector} \alias{dbDataType,DBIConnector-method} \alias{dbDataType_DBIObject} \alias{dbDataType,DBIObject-method} \alias{dbDriver_character} \alias{dbDriver,character-method} \alias{dbExecute_DBIConnection_character} \alias{dbExecute,DBIConnection,character-method} \alias{dbExistsTable_DBIConnection_Id} \alias{dbExistsTable,DBIConnection,Id-method} \alias{dbFetchArrowChunk_DBIResultArrow} \alias{dbFetchArrowChunk,DBIResultArrow-method} \alias{dbFetchArrow_DBIResultArrow} \alias{dbFetchArrow,DBIResultArrow-method} \alias{dbFetch_DBIResult} \alias{dbFetch,DBIResult-method} \alias{dbFetch_DBIResultArrow} \alias{dbFetch,DBIResultArrow-method} \alias{dbGetConnectArgs_DBIConnector} \alias{dbGetConnectArgs,DBIConnector-method} \alias{dbGetInfo_DBIResult} \alias{dbGetInfo,DBIResult-method} \alias{dbGetInfo_DBIResultArrow} \alias{dbGetInfo,DBIResultArrow-method} \alias{dbGetQueryArrow_DBIConnection_character} \alias{dbGetQueryArrow,DBIConnection-method} \alias{dbGetQuery_DBIConnection_character} \alias{dbGetQuery,DBIConnection,character-method} \alias{dbGetRowCount_DBIResultArrow} \alias{dbGetRowCount,DBIResultArrow-method} \alias{dbGetRowsAffected_DBIResultArrow} \alias{dbGetRowsAffected,DBIResultArrow-method} \alias{dbGetStatement_DBIResultArrow} \alias{dbGetStatement,DBIResultArrow-method} \alias{dbHasCompleted_DBIResultArrow} \alias{dbHasCompleted,DBIResultArrow-method} \alias{dbIsReadOnly_DBIConnector} \alias{dbIsReadOnly,DBIConnector-method} \alias{dbIsReadOnly_DBIObject} \alias{dbIsReadOnly,DBIObject-method} \alias{dbIsValid_DBIResultArrowDefault} \alias{dbIsValid,DBIResultArrowDefault-method} \alias{dbListFields_DBIConnection_Id} \alias{dbListFields,DBIConnection,Id-method} \alias{dbListFields_DBIConnection_character} \alias{dbListFields,DBIConnection,character-method} \alias{dbListObjects_DBIConnection_ANY} \alias{dbListObjects,DBIConnection-method} \alias{dbQuoteIdentifier_DBIConnection} \alias{dbQuoteIdentifier,DBIConnection,ANY-method} \alias{dbQuoteIdentifier,DBIConnection,character-method} \alias{dbQuoteIdentifier,DBIConnection,SQL-method} \alias{dbQuoteIdentifier,DBIConnection,Id-method} \alias{dbQuoteLiteral_DBIConnection} \alias{dbQuoteLiteral,DBIConnection-method} \alias{dbQuoteString_DBIConnection} \alias{dbQuoteString,DBIConnection,ANY-method} \alias{dbQuoteString,DBIConnection,character-method} \alias{dbQuoteString,DBIConnection,SQL-method} \alias{dbReadTableArrow_DBIConnection} \alias{dbReadTableArrow,DBIConnection-method} \alias{dbReadTable_DBIConnection_Id} \alias{dbReadTable,DBIConnection,Id-method} \alias{dbReadTable_DBIConnection_character} \alias{dbReadTable,DBIConnection,character-method} \alias{dbRemoveTable_DBIConnection_Id} \alias{dbRemoveTable,DBIConnection,Id-method} \alias{dbSendQueryArrow_DBIConnection} \alias{dbSendQueryArrow,DBIConnection-method} \alias{dbSendStatement_DBIConnection_character} \alias{dbSendStatement,DBIConnection,character-method} \alias{dbUnquoteIdentifier_DBIConnection} \alias{dbUnquoteIdentifier,DBIConnection-method} \alias{dbWithTransaction_DBIConnection} \alias{dbWithTransaction,DBIConnection-method} \alias{dbWriteTableArrow_DBIConnection} \alias{dbWriteTableArrow,DBIConnection-method} \alias{dbWriteTable_DBIConnection_Id_ANY} \alias{dbWriteTable,DBIConnection,Id-method} \alias{isSQLKeyword_DBIObject_character} \alias{isSQLKeyword,DBIObject,character-method} \alias{make.db.names_DBIObject_character} \alias{make.db.names,DBIObject,character-method} \alias{show_AnsiConnection} \alias{show,AnsiConnection-method} \alias{show_DBIConnection} \alias{show,DBIConnection-method} \alias{show_DBIConnector} \alias{show,DBIConnector-method} \alias{show_DBIDriver} \alias{show,DBIDriver-method} \alias{show_DBIResult} \alias{show,DBIResult-method} \alias{show_Id} \alias{show,Id-method} \alias{show_SQL} \alias{show,SQL-method} \alias{sqlAppendTable_DBIConnection} \alias{sqlAppendTable,DBIConnection-method} \alias{sqlCreateTable_DBIConnection} \alias{sqlCreateTable,DBIConnection-method} \alias{sqlData_DBIConnection} \alias{sqlData,DBIConnection-method} \alias{sqlInterpolate_DBIConnection} \alias{sqlInterpolate,DBIConnection-method} \alias{sqlParseVariables_DBIConnection} \alias{sqlParseVariables,DBIConnection-method} \title{Internal page for hidden aliases} \usage{ \S4method{SQLKeywords}{DBIObject}(dbObj, ...) \S4method{SQLKeywords}{missing}(dbObj, ...) \S4method{dbAppendTableArrow}{DBIConnection}(conn, name, value, ...) \S4method{dbAppendTable}{DBIConnection}(conn, name, value, ..., row.names = NULL) \S4method{dbBindArrow}{DBIResult}(res, params, ...) \S4method{dbBindArrow}{DBIResultArrowDefault}(res, params, ...) \S4method{dbBind}{DBIResultArrow}(res, params, ...) \S4method{dbCanConnect}{DBIDriver}(drv, ...) \S4method{dbClearResult}{DBIResultArrow}(res, ...) \S4method{dbConnect}{DBIConnector}(drv, ...) \S4method{dbCreateTableArrow}{DBIConnection}(conn, name, value, ..., temporary = FALSE) \S4method{dbCreateTable}{DBIConnection}(conn, name, fields, ..., row.names = NULL, temporary = FALSE) \S4method{dbDataType}{DBIConnector}(dbObj, obj, ...) \S4method{dbDataType}{DBIObject}(dbObj, obj, ...) \S4method{dbDriver}{character}(drvName, ...) \S4method{dbExecute}{DBIConnection,character}(conn, statement, ...) \S4method{dbExistsTable}{DBIConnection,Id}(conn, name, ...) \S4method{dbFetchArrowChunk}{DBIResultArrow}(res, ...) \S4method{dbFetchArrow}{DBIResultArrow}(res, ...) \S4method{dbFetch}{DBIResult}(res, n = -1, ...) \S4method{dbFetch}{DBIResultArrow}(res, n = -1, ...) \S4method{dbGetConnectArgs}{DBIConnector}(drv, eval = TRUE, ...) \S4method{dbGetInfo}{DBIResult}(dbObj, ...) \S4method{dbGetInfo}{DBIResultArrow}(dbObj, ...) \S4method{dbGetQueryArrow}{DBIConnection}(conn, statement, ...) \S4method{dbGetQuery}{DBIConnection,character}(conn, statement, ..., n = -1L) \S4method{dbGetRowCount}{DBIResultArrow}(res, ...) \S4method{dbGetRowsAffected}{DBIResultArrow}(res, ...) \S4method{dbGetStatement}{DBIResultArrow}(res, ...) \S4method{dbHasCompleted}{DBIResultArrow}(res, ...) \S4method{dbIsReadOnly}{DBIConnector}(dbObj, ...) \S4method{dbIsReadOnly}{DBIObject}(dbObj, ...) \S4method{dbIsValid}{DBIResultArrowDefault}(dbObj, ...) \S4method{dbListFields}{DBIConnection,Id}(conn, name, ...) \S4method{dbListFields}{DBIConnection,character}(conn, name, ...) \S4method{dbListObjects}{DBIConnection}(conn, prefix = NULL, ...) \S4method{dbQuoteIdentifier}{DBIConnection,ANY}(conn, x, ...) \S4method{dbQuoteIdentifier}{DBIConnection,character}(conn, x, ...) \S4method{dbQuoteIdentifier}{DBIConnection,SQL}(conn, x, ...) \S4method{dbQuoteIdentifier}{DBIConnection,Id}(conn, x, ...) \S4method{dbQuoteLiteral}{DBIConnection}(conn, x, ...) \S4method{dbQuoteString}{DBIConnection,ANY}(conn, x, ...) \S4method{dbQuoteString}{DBIConnection,character}(conn, x, ...) \S4method{dbQuoteString}{DBIConnection,SQL}(conn, x, ...) \S4method{dbReadTableArrow}{DBIConnection}(conn, name, ...) \S4method{dbReadTable}{DBIConnection,Id}(conn, name, ...) \S4method{dbReadTable}{DBIConnection,character}(conn, name, ..., row.names = FALSE, check.names = TRUE) \S4method{dbRemoveTable}{DBIConnection,Id}(conn, name, ...) \S4method{dbSendQueryArrow}{DBIConnection}(conn, statement, params = NULL, ...) \S4method{dbSendStatement}{DBIConnection,character}(conn, statement, ...) \S4method{dbUnquoteIdentifier}{DBIConnection}(conn, x, ...) \S4method{dbWithTransaction}{DBIConnection}(conn, code) \S4method{dbWriteTableArrow}{DBIConnection}( conn, name, value, append = FALSE, overwrite = FALSE, ..., temporary = FALSE ) \S4method{dbWriteTable}{DBIConnection,Id}(conn, name, value, ...) \S4method{isSQLKeyword}{DBIObject,character}( dbObj, name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3], ... ) \S4method{make.db.names}{DBIObject,character}( dbObj, snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE, ... ) \S4method{show}{AnsiConnection}(object) \S4method{show}{DBIConnection}(object) \S4method{show}{DBIConnector}(object) \S4method{show}{DBIDriver}(object) \S4method{show}{DBIResult}(object) \S4method{show}{Id}(object) \S4method{show}{SQL}(object) \S4method{sqlAppendTable}{DBIConnection}(con, table, values, row.names = NA, ...) \S4method{sqlCreateTable}{DBIConnection}(con, table, fields, row.names = NA, temporary = FALSE, ...) \S4method{sqlData}{DBIConnection}(con, value, row.names = NA, ...) \S4method{sqlInterpolate}{DBIConnection}(conn, sql, ..., .dots = list()) \S4method{sqlParseVariables}{DBIConnection}(conn, sql, ...) } \arguments{ \item{n}{Number of rows to fetch, default -1} \item{object}{Table object to print} } \description{ For S4 methods that require a documentation entry but only clutter the index. } \keyword{internal} DBI/man/dbWriteTable.Rd0000644000176200001440000002141615005323731014265 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/13-dbWriteTable.R \name{dbWriteTable} \alias{dbWriteTable} \title{Copy data frames to database tables} \usage{ dbWriteTable(conn, name, value, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{value}{A \link{data.frame} (or coercible to data.frame).} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbWriteTable()} returns \code{TRUE}, invisibly. } \description{ Writes, overwrites or appends a data frame to a database table, optionally converting row names to a column and specifying SQL data types for fields. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbWriteTable")} } \details{ This function expects a data frame. Use \code{\link[=dbWriteTableArrow]{dbWriteTableArrow()}} to write an Arrow object. This function is useful if you want to create and load a table at the same time. Use \code{\link[=dbAppendTable]{dbAppendTable()}} or \code{\link[=dbAppendTableArrow]{dbAppendTableArrow()}} for appending data to an existing table, \code{\link[=dbCreateTable]{dbCreateTable()}} or \code{\link[=dbCreateTableArrow]{dbCreateTableArrow()}} for creating a table, and \code{\link[=dbExistsTable]{dbExistsTable()}} and \code{\link[=dbRemoveTable]{dbRemoveTable()}} for overwriting tables. DBI only standardizes writing data frames with \code{dbWriteTable()}. Some backends might implement methods that can consume CSV files or other data formats. For details, see the documentation for the individual methods. } \section{Failure modes}{ If the table exists, and both \code{append} and \code{overwrite} arguments are unset, or \code{append = TRUE} and the data frame with the new data has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Invalid values for the additional arguments \code{row.names}, \code{overwrite}, \code{append}, \code{field.types}, and \code{temporary} (non-scalars, unsupported data types, \code{NA}, incompatible values, duplicate or missing names, incompatible columns) also raise an error. } \section{Additional arguments}{ The following arguments are not part of the \code{dbWriteTable()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{row.names} (default: \code{FALSE}) \item \code{overwrite} (default: \code{FALSE}) \item \code{append} (default: \code{FALSE}) \item \code{field.types} (default: \code{NULL}) \item \code{temporary} (default: \code{FALSE}) } They must be provided as named arguments. See the "Specification" and "Value" sections for details on their usage. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbWriteTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } The \code{value} argument must be a data frame with a subset of the columns of the existing table if \code{append = TRUE}. The order of the columns does not matter with \code{append = TRUE}. If the \code{overwrite} argument is \code{TRUE}, an existing table of the same name will be overwritten. This argument doesn't change behavior if the table does not exist yet. If the \code{append} argument is \code{TRUE}, the rows in an existing table are preserved, and the new data are appended. If the table doesn't exist yet, it is created. If the \code{temporary} argument is \code{TRUE}, the table is not available in a second connection and is gone after reconnecting. Not all backends support this argument. A regular, non-temporary table is visible in a second connection, in a pre-existing connection, and after reconnecting to the database. SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with \code{\link[DBI:dbReadTable]{DBI::dbReadTable()}}: \itemize{ \item integer \item numeric (the behavior for \code{Inf} and \code{NaN} is not specified) \item logical \item \code{NA} as NULL \item 64-bit values (using \code{"bigint"} as field type); the result can be \itemize{ \item converted to a numeric, which may lose precision, \item converted a character vector, which gives the full decimal representation \item written to another table and read again unchanged } \item character (in both UTF-8 and native encodings), supporting empty strings before and after a non-empty string \item factor (returned as character) \item list of raw (if supported by the database) \item objects of type \link[blob:blob]{blob::blob} (if supported by the database) \item date (if supported by the database; returned as \code{Date}), also for dates prior to 1970 or 1900 or after 2038 \item time (if supported by the database; returned as objects that inherit from \code{difftime}) \item timestamp (if supported by the database; returned as \code{POSIXct} respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) } Mixing column types in the same table is supported. The \code{field.types} argument must be a named character vector with at most one entry for each column. It indicates the SQL data type to be used for a new column. If a column is missed from \code{field.types}, the type is inferred from the input data with \code{\link[DBI:dbDataType]{DBI::dbDataType()}}. The interpretation of \link{rownames} depends on the \code{row.names} argument, see \code{\link[DBI:rownames]{DBI::sqlRownamesToColumn()}} for details: \itemize{ \item If \code{FALSE} or \code{NULL}, row names are ignored. \item If \code{TRUE}, row names are converted to a column named "row_names", even if the input data frame only has natural row names from 1 to \code{nrow(...)}. \item If \code{NA}, a column named "row_names" is created if the data has custom row names, no extra column is created in the case of natural row names. \item If a string, this specifies the name of the column in the remote table that contains the row names, even if the input data frame only has natural row names. } The default is \code{row.names = FALSE}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:5, ]) dbReadTable(con, "mtcars") dbWriteTable(con, "mtcars", mtcars[6:10, ], append = TRUE) dbReadTable(con, "mtcars") dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE) dbReadTable(con, "mtcars") # No row names dbWriteTable(con, "mtcars", mtcars[1:10, ], overwrite = TRUE, row.names = FALSE) dbReadTable(con, "mtcars") \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/figures/0000755000176200001440000000000014602466070013074 5ustar liggesusersDBI/man/figures/lifecycle-questioning.svg0000644000176200001440000000244414602466070020123 0ustar liggesusers lifecycle: questioning lifecycle questioning DBI/man/figures/lifecycle-stable.svg0000644000176200001440000000247214602466070017031 0ustar liggesusers lifecycle: stable lifecycle stable DBI/man/figures/lifecycle-experimental.svg0000644000176200001440000000245014602466070020250 0ustar liggesusers lifecycle: experimental lifecycle experimental DBI/man/figures/lifecycle-deprecated.svg0000644000176200001440000000244014602466070017652 0ustar liggesusers lifecycle: deprecated lifecycle deprecated DBI/man/figures/lifecycle-superseded.svg0000644000176200001440000000244014602466070017715 0ustar liggesusers lifecycle: superseded lifecycle superseded DBI/man/figures/lifecycle-archived.svg0000644000176200001440000000243014602466070017336 0ustar liggesusers lifecycle: archived lifecycle archived DBI/man/figures/lifecycle-defunct.svg0000644000176200001440000000242414602466070017204 0ustar liggesusers lifecycle: defunct lifecycle defunct DBI/man/figures/lifecycle-soft-deprecated.svg0000644000176200001440000000246614602466070020633 0ustar liggesusers lifecycle: soft-deprecated lifecycle soft-deprecated DBI/man/figures/lifecycle-maturing.svg0000644000176200001440000000243014602466070017377 0ustar liggesusers lifecycle: maturing lifecycle maturing DBI/man/rownames.Rd0000644000176200001440000000267714350241735013565 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rownames.R \name{rownames} \alias{rownames} \alias{sqlRownamesToColumn} \alias{sqlColumnToRownames} \title{Convert row names back and forth between columns} \usage{ sqlRownamesToColumn(df, row.names = NA) sqlColumnToRownames(df, row.names = NA) } \arguments{ \item{df}{A data frame} \item{row.names}{Either \code{TRUE}, \code{FALSE}, \code{NA} or a string. If \code{TRUE}, always translate row names to a column called "row_names". If \code{FALSE}, never translate row names. If \code{NA}, translate rownames only if they're a character vector. A string is equivalent to \code{TRUE}, but allows you to override the default name. For backward compatibility, \code{NULL} is equivalent to \code{FALSE}.} } \description{ These functions provide a reasonably automatic way of preserving the row names of data frame during back-and-forth translation to an SQL table. By default, row names will be converted to an explicit column called "row_names", and any query returning a column called "row_names" will have those automatically set as row names. These methods are mostly useful for backend implementers. } \examples{ # If have row names sqlRownamesToColumn(head(mtcars)) sqlRownamesToColumn(head(mtcars), FALSE) sqlRownamesToColumn(head(mtcars), "ROWNAMES") # If don't have sqlRownamesToColumn(head(iris)) sqlRownamesToColumn(head(iris), TRUE) sqlRownamesToColumn(head(iris), "ROWNAMES") } DBI/man/dbQuoteLiteral.Rd0000644000176200001440000000570715005323731014642 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbQuoteLiteral.R \name{dbQuoteLiteral} \alias{dbQuoteLiteral} \title{Quote literal values} \usage{ dbQuoteLiteral(conn, x, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{x}{A vector to quote as string.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbQuoteLiteral()} returns an object that can be coerced to \link{character}, of the same length as the input. For an empty integer, numeric, character, logical, date, time, or blob vector, this function returns a length-0 object. When passing the returned object again to \code{dbQuoteLiteral()} as \code{x} argument, it is returned unchanged. Passing objects of class \link[DBI:SQL]{DBI::SQL} should also return them unchanged. (For backends it may be most convenient to return \link[DBI:SQL]{DBI::SQL} objects to achieve this behavior, but this is not required.) } \description{ Call these methods to generate a string that is suitable for use in a query as a literal value of the correct type, to make sure that you generate valid SQL and protect against SQL injection attacks. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbQuoteLiteral")} } \section{Failure modes}{ Passing a list for the \code{x} argument raises an error. } \section{Specification}{ The returned expression can be used in a \verb{SELECT ...} query, and the value of \code{dbGetQuery(paste0("SELECT ", dbQuoteLiteral(x)))[[1]]} must be equal to \code{x} for any scalar integer, numeric, string, and logical. If \code{x} is \code{NA}, the result must merely satisfy \code{\link[=is.na]{is.na()}}. The literals \code{"NA"} or \code{"NULL"} are not treated specially. \code{NA} should be translated to an unquoted SQL \code{NULL}, so that the query \verb{SELECT * FROM (SELECT 1) a WHERE ... IS NULL} returns one row. } \examples{ # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteLiteral(ANSI(), name) # NAs become NULL dbQuoteLiteral(ANSI(), c(1:3, NA)) # Logicals become integers by default dbQuoteLiteral(ANSI(), c(TRUE, FALSE, NA)) # Raw vectors become hex strings by default dbQuoteLiteral(ANSI(), list(as.raw(1:3), NULL)) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteLiteral(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteLiteral(ANSI(), dbQuoteLiteral(ANSI(), name)) } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteString}()} } \concept{DBIResult generics} DBI/man/dbSendQueryArrow.Rd0000644000176200001440000002020715005323731015152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/24-dbSendQueryArrow.R \name{dbSendQueryArrow} \alias{dbSendQueryArrow} \title{Execute a query on a given database connection for retrieval via Arrow} \usage{ dbSendQueryArrow(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbSendQueryArrow()} returns an S4 object that inherits from \link[DBI:DBIResultArrow-class]{DBI::DBIResultArrow}. The result set can be used with \code{\link[DBI:dbFetchArrow]{DBI::dbFetchArrow()}} to extract records. Once you have finished using a result, make sure to clear it with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} The \code{dbSendQueryArrow()} method only submits and synchronously executes the SQL query to the database engine. It does \emph{not} extract any records --- for that you need to use the \code{\link[=dbFetchArrow]{dbFetchArrow()}} method, and then you must call \code{\link[=dbClearResult]{dbClearResult()}} when you finish fetching the records you need. For interactive use, you should almost always prefer \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}. Use \code{\link[=dbSendQuery]{dbSendQuery()}} or \code{\link[=dbGetQuery]{dbGetQuery()}} instead to retrieve the results as a data frame. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendQueryArrow")} } \details{ This method is for \code{SELECT} queries only. Some backends may support data manipulation queries through this method for compatibility reasons. However, callers are strongly encouraged to use \code{\link[=dbSendStatement]{dbSendStatement()}} for data manipulation statements. } \section{The data retrieval flow for Arrow streams}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}, is implemented by \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}} to create a result set object of class \linkS4class{DBIResultArrow}. \item Optionally, bind query parameters with \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Use \code{\link[=dbFetchArrow]{dbFetchArrow()}} to get a data stream. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An error is raised when issuing a query over a closed or invalid connection, or if the query is not a non-\code{NA} string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the \code{params} argument) or the \code{immediate} argument is set to \code{TRUE}. } \section{Additional arguments}{ The following arguments are not part of the \code{dbSendQueryArrow()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" sections for details on their usage. } \section{Specification}{ No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with \code{dbClearResult()}. The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Retrieve data as arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetchArrow(rs) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For updates: \code{\link[=dbSendStatement]{dbSendStatement()}} and \code{\link[=dbExecute]{dbExecute()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()} } \concept{DBIConnection generics} \concept{data retrieval generics} DBI/man/dbGetStatement.Rd0000644000176200001440000000327515005323731014632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetStatement.R \name{dbGetStatement} \alias{dbGetStatement} \title{Get the statement associated with a result set} \usage{ dbGetStatement(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbGetStatement()} returns a string, the query used in either \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}. } \description{ Returns the statement that was passed to \code{\link[=dbSendQuery]{dbSendQuery()}} or \code{\link[=dbSendStatement]{dbSendStatement()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetStatement")} } \section{Failure modes}{ Attempting to query the statement for a result set cleared with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} gives an error. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendQuery(con, "SELECT * FROM mtcars") dbGetStatement(rs) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} } \concept{DBIResult generics} DBI/man/dbSendStatement.Rd0000644000176200001440000002036415005323731015002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbSendStatement.R \name{dbSendStatement} \alias{dbSendStatement} \title{Execute a data manipulation statement on a given database connection} \usage{ dbSendStatement(conn, statement, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{statement}{a character string containing SQL.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbSendStatement()} returns an S4 object that inherits from \link[DBI:DBIResult-class]{DBI::DBIResult}. The result set can be used with \code{\link[DBI:dbGetRowsAffected]{DBI::dbGetRowsAffected()}} to determine the number of rows affected by the query. Once you have finished using a result, make sure to clear it with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. } \description{ The \code{dbSendStatement()} method only submits and synchronously executes the SQL data manipulation statement (e.g., \code{UPDATE}, \code{DELETE}, \verb{INSERT INTO}, \verb{DROP TABLE}, ...) to the database engine. To query the number of affected rows, call \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}} on the returned result object. You must also call \code{\link[=dbClearResult]{dbClearResult()}} after that. For interactive use, you should almost always prefer \code{\link[=dbExecute]{dbExecute()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendStatement")} } \details{ \code{\link[=dbSendStatement]{dbSendStatement()}} comes with a default implementation that simply forwards to \code{\link[=dbSendQuery]{dbSendQuery()}}, to support backends that only implement the latter. } \section{The command execution flow}{ This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbExecute]{dbExecute()}}, which should be sufficient for non-parameterized queries. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendStatement]{dbSendStatement()}} to create a result set object of class \linkS4class{DBIResult}. For some queries you need to pass \code{immediate = TRUE}. \item Optionally, bind query parameters with\code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}} to retrieve the number of rows affected by the query. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An error is raised when issuing a statement over a closed or invalid connection, or if the statement is not a non-\code{NA} string. An error is also raised if the syntax of the query is invalid and all query parameters are given (by passing the \code{params} argument) or the \code{immediate} argument is set to \code{TRUE}. } \section{Additional arguments}{ The following arguments are not part of the \code{dbSendStatement()} generic (to improve compatibility across backends) but are part of the DBI specification: \itemize{ \item \code{params} (default: \code{NULL}) \item \code{immediate} (default: \code{NULL}) } They must be provided as named arguments. See the "Specification" sections for details on their usage. } \section{Specification}{ No warnings occur under normal conditions. When done, the DBIResult object must be cleared with a call to \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}}. Failure to clear the result set leads to a warning when the connection is closed. If the backend supports only one open result set per connection, issuing a second query invalidates an already open result set and raises a warning. The newly opened result set is valid and must be cleared with \code{dbClearResult()}. The \code{param} argument allows passing query parameters, see \code{\link[DBI:dbBind]{DBI::dbBind()}} for details. } \section{Specification for the \code{immediate} argument}{ The \code{immediate} argument supports distinguishing between "direct" and "prepared" APIs offered by many database drivers. Passing \code{immediate = TRUE} leads to immediate execution of the query or statement, via the "direct" API (if supported by the driver). The default \code{NULL} means that the backend should choose whatever API makes the most sense for the database, and (if relevant) tries the other API if the first attempt fails. A successful second attempt should result in a message that suggests passing the correct \code{immediate} argument. Examples for possible behaviors: \enumerate{ \item DBI backend defaults to \code{immediate = TRUE} internally \enumerate{ \item A query without parameters is passed: query is executed \item A query with parameters is passed: \enumerate{ \item \code{params} not given: rejected immediately by the database because of a syntax error in the query, the backend tries \code{immediate = FALSE} (and gives a message) \item \code{params} given: query is executed using \code{immediate = FALSE} } } \item DBI backend defaults to \code{immediate = FALSE} internally \enumerate{ \item A query without parameters is passed: \enumerate{ \item simple query: query is executed \item "special" query (such as setting a config options): fails, the backend tries \code{immediate = TRUE} (and gives a message) } \item A query with parameters is passed: \enumerate{ \item \code{params} not given: waiting for parameters via \code{\link[DBI:dbBind]{DBI::dbBind()}} \item \code{params} given: query is executed } } } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cars", head(cars, 3)) rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (1, 1), (2, 2), (3, 3)" ) dbHasCompleted(rs) dbGetRowsAffected(rs) dbClearResult(rs) dbReadTable(con, "cars") # there are now 6 rows # Pass one set of values directly using the param argument: rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)", params = list(4L, 5L) ) dbClearResult(rs) # Pass multiple sets of values using dbBind(): rs <- dbSendStatement( con, "INSERT INTO cars (speed, dist) VALUES (?, ?)" ) dbBind(rs, list(5:6, 6:7)) dbBind(rs, list(7L, 8L)) dbClearResult(rs) dbReadTable(con, "cars") # there are now 10 rows dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ For queries: \code{\link[=dbSendQuery]{dbSendQuery()}} and \code{\link[=dbGetQuery]{dbGetQuery()}}. Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other command execution generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbExecute}()}, \code{\link{dbGetRowsAffected}()} } \concept{DBIConnection generics} \concept{command execution generics} DBI/man/dbGetConnectArgs.Rd0000644000176200001440000000245415005150137015070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetConnectArgs.R \name{dbGetConnectArgs} \alias{dbGetConnectArgs} \title{Get connection arguments} \usage{ dbGetConnectArgs(drv, eval = TRUE, ...) } \arguments{ \item{drv}{A object inheriting from \linkS4class{DBIConnector}.} \item{eval}{Set to \code{FALSE} to return the functions that generate the argument instead of evaluating them.} \item{...}{Other arguments passed on to methods. Not otherwise used.} } \description{ Returns the arguments stored in a \linkS4class{DBIConnector} object for inspection, optionally evaluating them. This function is called by \code{\link[=dbConnect]{dbConnect()}} and usually does not need to be called directly. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetConnectArgs")} } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} cnr <- new("DBIConnector", .drv = RSQLite::SQLite(), .conn_args = list(dbname = ":memory:", password = function() "supersecret") ) dbGetConnectArgs(cnr) dbGetConnectArgs(cnr, eval = FALSE) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnector generics: \code{\link{DBIConnector-class}}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbIsReadOnly}()} } \concept{DBIConnector generics} DBI/man/dbGetException.Rd0000644000176200001440000000314715005150137014620 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetException.R \name{dbGetException} \alias{dbGetException} \title{Get DBMS exceptions} \usage{ dbGetException(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \value{ a list with elements \code{errorNum} (an integer error number) and \code{errorMsg} (a character string) describing the last error in the connection \code{conn}. } \description{ DEPRECATED. Backends should use R's condition system to signal errors and warnings. } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} \keyword{internal} DBI/man/dbCanConnect.Rd0000644000176200001440000000337215005150137014235 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbCanConnect.R \name{dbCanConnect} \alias{dbCanConnect} \title{Check if a connection to a DBMS can be established} \usage{ dbCanConnect(drv, ...) } \arguments{ \item{drv}{An object that inherits from \link[=DBIDriver-class]{DBI::DBIDriver}, or an existing \link[=DBIConnection-class]{DBI::DBIConnection} object (in order to clone an existing connection).} \item{...}{Authentication arguments needed by the DBMS instance; these typically include \code{user}, \code{password}, \code{host}, \code{port}, \code{dbname}, etc. For details see the appropriate \code{DBIDriver}.} } \value{ A scalar logical. If \code{FALSE}, the \code{"reason"} attribute indicates a reason for failure. } \description{ Like \code{\link[=dbConnect]{dbConnect()}}, but only checks validity without actually returning a connection object. The default implementation opens a connection and disconnects on success, but individual backends might implement a lighter-weight check. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbCanConnect")} } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} # SQLite only needs a path to the database. (Here, ":memory:" is a special # path that creates an in-memory database.) Other database drivers # will require more details (like user, password, host, port, etc.) dbCanConnect(RSQLite::SQLite(), ":memory:") \dontshow{\}) # examplesIf} } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} } \concept{DBIDriver generics} DBI/man/dbFetch.Rd0000644000176200001440000002030715005323731013252 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbFetch.R, R/fetch.R \name{dbFetch} \alias{dbFetch} \alias{fetch} \title{Fetch records from a previously executed query} \usage{ dbFetch(res, n = -1, ...) fetch(res, n = -1, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}, created by \code{\link[=dbSendQuery]{dbSendQuery()}}.} \item{n}{maximum number of records to retrieve per fetch. Use \code{n = -1} or \code{n = Inf} to retrieve all pending records. Some implementations may recognize other special values.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbFetch()} always returns a \link{data.frame} with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. Passing \code{n = NA} is supported and returns an arbitrary number of rows (at least one) as specified by the driver, but at most the remaining rows in the result set. } \description{ Fetch the next \code{n} elements (rows) from the result set and return them as a data.frame. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbFetch")} } \details{ \code{fetch()} is provided for compatibility with older DBI clients - for all new code you are strongly encouraged to use \code{dbFetch()}. The default implementation for \code{dbFetch()} calls \code{fetch()} so that it is compatible with existing code. Modern backends should implement for \code{dbFetch()} only. } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An attempt to fetch from a closed result set raises an error. If the \code{n} argument is not an atomic whole number greater or equal to -1 or Inf, an error is raised, but a subsequent call to \code{dbFetch()} with proper \code{n} argument succeeds. Calling \code{dbFetch()} on a result set from a data manipulation query created by \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}} can be fetched and return an empty data frame, with a warning. } \section{Specification}{ Fetching multi-row queries with one or more columns by default returns the entire result. Multi-row queries can also be fetched progressively by passing a whole number (\link{integer} or \link{numeric}) as the \code{n} argument. A value of \link{Inf} for the \code{n} argument is supported and also returns the full result. If more rows than available are fetched, the result is returned in full without warning. If fewer rows than requested are returned, further fetches will return a data frame with zero rows. If zero rows are fetched, the columns of the data frame are still fully typed. Fetching fewer rows than available is permitted, no warning is issued when clearing the result set. A column named \code{row_names} is treated like any other column. The column types of the returned data frame depend on the data returned: \itemize{ \item \link{integer} (or coercible to an integer) for integer values between -2^31 and 2^31 - 1, with \link{NA} for SQL \code{NULL} values \item \link{numeric} for numbers with a fractional component, with NA for SQL \code{NULL} values \item \link{logical} for Boolean values (some backends may return an integer); with NA for SQL \code{NULL} values \item \link{character} for text, with NA for SQL \code{NULL} values \item lists of \link{raw} for blobs with \link{NULL} entries for SQL NULL values \item coercible using \code{\link[=as.Date]{as.Date()}} for dates, with NA for SQL \code{NULL} values (also applies to the return value of the SQL function \code{current_date}) \item coercible using \code{\link[hms:hms]{hms::as_hms()}} for times, with NA for SQL \code{NULL} values (also applies to the return value of the SQL function \code{current_time}) \item coercible using \code{\link[=as.POSIXct]{as.POSIXct()}} for timestamps, with NA for SQL \code{NULL} values (also applies to the return value of the SQL function \code{current_timestamp}) } If dates and timestamps are supported by the backend, the following R types are used: \itemize{ \item \link[=Dates]{Date} for dates (also applies to the return value of the SQL function \code{current_date}) \item \link[=DateTimeClasses]{POSIXct} for timestamps (also applies to the return value of the SQL function \code{current_timestamp}) } R has no built-in type with lossless support for the full range of 64-bit or larger integers. If 64-bit integers are returned from a query, the following rules apply: \itemize{ \item Values are returned in a container with support for the full range of valid 64-bit values (such as the \code{integer64} class of the \pkg{bit64} package) \item Coercion to numeric always returns a number that is as close as possible to the true value \item Loss of precision when converting to numeric gives a warning \item Conversion to character always returns a lossless decimal representation of the data } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(rs) dbClearResult(rs) # Fetch in chunks rs <- dbSendQuery(con, "SELECT * FROM mtcars") while (!dbHasCompleted(rs)) { chunk <- dbFetch(rs, 10) print(nrow(chunk)) } dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Close the result set with \code{\link[=dbClearResult]{dbClearResult()}} as soon as you finish retrieving the records you want. Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIResult generics} \concept{data retrieval generics} DBI/man/dbReadTableArrow.Rd0000644000176200001440000000745515005323731015070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbReadTableArrow.R \name{dbReadTableArrow} \alias{dbReadTableArrow} \title{Read database tables as Arrow objects} \usage{ dbReadTableArrow(conn, name, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbReadTableArrow()} returns an Arrow object that contains the complete data from the remote table, effectively the result of calling \code{\link[DBI:dbGetQueryArrow]{DBI::dbGetQueryArrow()}} with \verb{SELECT * FROM }. An empty table is returned as an Arrow object with zero rows. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Reads a database table as an Arrow object. Use \code{\link[=dbReadTable]{dbReadTable()}} instead to obtain a data frame. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbReadTableArrow")} } \details{ This function returns an Arrow object. Convert it to a data frame with \code{\link[=as.data.frame]{as.data.frame()}} or use \code{\link[=dbReadTable]{dbReadTable()}} to obtain a data frame. } \section{Failure modes}{ An error is raised if the table does not exist. An error is raised when calling this method for a closed or invalid connection. An error is raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. } \section{Specification}{ The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbReadTableArrow()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done } } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} # Read data as Arrow table con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars[1:10, ]) dbReadTableArrow(con, "mtcars") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/dbClearResult.Rd0000644000176200001440000001452615005323731014454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbClearResult.R \name{dbClearResult} \alias{dbClearResult} \title{Clear a result set} \usage{ dbClearResult(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbClearResult()} returns \code{TRUE}, invisibly, for result sets obtained from \code{dbSendQuery()}, \code{dbSendStatement()}, or \code{dbSendQueryArrow()}, } \description{ Frees all resources (local and remote) associated with a result set. This step is mandatory for all objects obtained by calling \code{\link[=dbSendQuery]{dbSendQuery()}} or \code{\link[=dbSendStatement]{dbSendStatement()}}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbClearResult")} } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{The command execution flow}{ This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbExecute]{dbExecute()}}, which should be sufficient for non-parameterized queries. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendStatement]{dbSendStatement()}} to create a result set object of class \linkS4class{DBIResult}. For some queries you need to pass \code{immediate = TRUE}. \item Optionally, bind query parameters with\code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}} to retrieve the number of rows affected by the query. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An attempt to close an already closed result set issues a warning for \code{dbSendQuery()}, \code{dbSendStatement()}, and \code{dbSendQueryArrow()}, } \section{Specification}{ \code{dbClearResult()} frees all resources associated with retrieving the result of a query or update operation. The DBI backend can expect a call to \code{dbClearResult()} for each \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}} call. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") rs <- dbSendQuery(con, "SELECT 1") print(dbFetch(rs)) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbBind}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} Other command execution generics: \code{\link{dbBind}()}, \code{\link{dbExecute}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbSendStatement}()} } \concept{DBIResult generics} \concept{DBIResultArrow generics} \concept{command execution generics} \concept{data retrieval generics} DBI/man/dbDisconnect.Rd0000644000176200001440000000410715005323731014312 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbDisconnect.R \name{dbDisconnect} \alias{dbDisconnect} \title{Disconnect (close) a connection} \usage{ dbDisconnect(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbDisconnect()} returns \code{TRUE}, invisibly. } \description{ This closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbDisconnect")} } \section{Failure modes}{ A warning is issued on garbage collection when a connection has been released without calling \code{dbDisconnect()}, but this cannot be tested automatically. At least one warning is issued immediately when calling \code{dbDisconnect()} on an already disconnected or invalid connection. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/ANSI.Rd0000644000176200001440000000046314602466070012454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/06-ANSI.R \name{ANSI} \alias{ANSI} \title{A dummy DBI connector that simulates ANSI-SQL compliance} \usage{ ANSI() } \description{ A dummy DBI connector that simulates ANSI-SQL compliance } \examples{ ANSI() } \keyword{internal} DBI/man/dbFetchArrow.Rd0000644000176200001440000001023015005323731014257 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbFetchArrow.R \name{dbFetchArrow} \alias{dbFetchArrow} \title{Fetch records from a previously executed query as an Arrow object} \usage{ dbFetchArrow(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResultArrow-class]{DBI::DBIResultArrow}, created by \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbFetchArrow()} always returns an object coercible to a \link{data.frame} with as many rows as records were fetched and as many columns as fields in the result set, even if the result is a single value or has one or zero rows. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Fetch the result set and return it as an Arrow object. Use \code{\link[=dbFetchArrowChunk]{dbFetchArrowChunk()}} to fetch results in chunks. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbFetchArrow")} } \section{The data retrieval flow for Arrow streams}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as an Arrow stream. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}, is implemented by \code{\link[=dbGetQueryArrow]{dbGetQueryArrow()}}, which should be sufficient unless you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQueryArrow]{dbSendQueryArrow()}} to create a result set object of class \linkS4class{DBIResultArrow}. \item Optionally, bind query parameters with \code{\link[=dbBindArrow]{dbBindArrow()}} or \code{\link[=dbBind]{dbBind()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Use \code{\link[=dbFetchArrow]{dbFetchArrow()}} to get a data stream. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An attempt to fetch from a closed result set raises an error. } \section{Specification}{ Fetching multi-row queries with one or more columns by default returns the entire result. The object returned by \code{dbFetchArrow()} can also be passed to \code{\link[nanoarrow:as_nanoarrow_array_stream]{nanoarrow::as_nanoarrow_array_stream()}} to create a nanoarrow array stream object that can be used to read the result set in batches. The chunk size is implementation-specific. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE) && requireNamespace("nanoarrow", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) # Fetch all results rs <- dbSendQueryArrow(con, "SELECT * FROM mtcars WHERE cyl = 4") as.data.frame(dbFetchArrow(rs)) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Close the result set with \code{\link[=dbClearResult]{dbClearResult()}} as soon as you finish retrieving the records you want. Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsValid}()} Other data retrieval generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()} } \concept{DBIResultArrow generics} \concept{data retrieval generics} DBI/man/sqlAppendTable.Rd0000644000176200001440000000531514350241735014621 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sqlAppendTable.R, R/sqlAppendTableTemplate.R \name{sqlAppendTable} \alias{sqlAppendTable} \alias{sqlAppendTableTemplate} \title{Compose query to insert rows into a table} \usage{ sqlAppendTable(con, table, values, row.names = NA, ...) sqlAppendTableTemplate( con, table, values, row.names = NA, prefix = "?", ..., pattern = "" ) } \arguments{ \item{con}{A database connection.} \item{table}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{values}{A data frame. Factors will be converted to character vectors. Character vectors will be escaped with \code{\link[=dbQuoteString]{dbQuoteString()}}.} \item{row.names}{Either \code{TRUE}, \code{FALSE}, \code{NA} or a string. If \code{TRUE}, always translate row names to a column called "row_names". If \code{FALSE}, never translate row names. If \code{NA}, translate rownames only if they're a character vector. A string is equivalent to \code{TRUE}, but allows you to override the default name. For backward compatibility, \code{NULL} is equivalent to \code{FALSE}.} \item{...}{Other arguments used by individual methods.} \item{prefix}{Parameter prefix to use for placeholders.} \item{pattern}{Parameter pattern to use for placeholders: \itemize{ \item \code{""}: no pattern \item \code{"1"}: position \item anything else: field name }} } \description{ \code{sqlAppendTable()} generates a single SQL string that inserts a data frame into an existing table. \code{sqlAppendTableTemplate()} generates a template suitable for use with \code{\link[=dbBind]{dbBind()}}. The default methods are ANSI SQL 99 compliant. These methods are mostly useful for backend implementers. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("sqlAppendTable")} } \details{ The \code{row.names} argument must be passed explicitly in order to avoid a compatibility warning. The default will be changed in a later release. } \examples{ sqlAppendTable(ANSI(), "iris", head(iris)) sqlAppendTable(ANSI(), "mtcars", head(mtcars)) sqlAppendTable(ANSI(), "mtcars", head(mtcars), row.names = FALSE) sqlAppendTableTemplate(ANSI(), "iris", iris) sqlAppendTableTemplate(ANSI(), "mtcars", mtcars) sqlAppendTableTemplate(ANSI(), "mtcars", mtcars, row.names = FALSE) } \concept{SQL generation} DBI/man/dbCallProc.Rd0000644000176200001440000000127415005150137013720 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbCallProc.R \name{dbCallProc} \alias{dbCallProc} \title{Call an SQL stored procedure} \usage{ dbCallProc(conn, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{...}{Other parameters passed on to methods.} } \description{ \strong{Deprecated since 2014} } \details{ The recommended way of calling a stored procedure is now \enumerate{ \item{\code{\link{dbGetQuery}} if a result set is returned} \item{\code{\link{dbExecute}} for data manipulation and other cases where no result set is returned} } } \keyword{internal} DBI/man/dbSetDataMappings.Rd0000644000176200001440000000167115005150137015246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbSetDataMappings.R \name{dbSetDataMappings} \alias{dbSetDataMappings} \title{Set data mappings between an DBMS and R.} \usage{ dbSetDataMappings(res, flds, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{flds}{a field description object as returned by \code{dbColumnInfo}.} \item{...}{Other arguments passed on to methods.} } \description{ This generic is deprecated since no working implementation was ever produced. } \details{ Sets one or more conversion functions to handle the translation of DBMS data types to R objects. This is only needed for non-primitive data, since all DBI drivers handle the common base types (integers, numeric, strings, etc.) The details on conversion functions (e.g., arguments, whether they can invoke initializers and/or destructors) have not been specified. } \keyword{internal} DBI/man/dbWithTransaction.Rd0000644000176200001440000000665615005323731015355 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbWithTransaction.R, % R/dbWithTransaction_DBIConnection.R \name{dbWithTransaction} \alias{dbWithTransaction} \alias{dbBreak} \title{Self-contained SQL transactions} \usage{ dbWithTransaction(conn, code, ...) dbBreak() } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{code}{An arbitrary block of R code.} \item{...}{Other parameters passed on to methods.} } \value{ \code{dbWithTransaction()} returns the value of the executed code. } \description{ Given that \link{transactions} are implemented, this function allows you to pass in code that is run in a transaction. The default method of \code{dbWithTransaction()} calls \code{\link[=dbBegin]{dbBegin()}} before executing the code, and \code{\link[=dbCommit]{dbCommit()}} after successful completion, or \code{\link[=dbRollback]{dbRollback()}} in case of an error. The advantage is that you don't have to remember to do \code{dbBegin()} and \code{dbCommit()} or \code{dbRollback()} -- that is all taken care of. The special function \code{dbBreak()} allows an early exit with rollback, it can be called only inside \code{dbWithTransaction()}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbWithTransaction")} } \details{ DBI implements \code{dbWithTransaction()}, backends should need to override this generic only if they implement specialized handling. } \section{Failure modes}{ Failure to initiate the transaction (e.g., if the connection is closed or invalid or if \code{\link[DBI:transactions]{DBI::dbBegin()}} has been called already) gives an error. } \section{Specification}{ \code{dbWithTransaction()} initiates a transaction with \code{dbBegin()}, executes the code given in the \code{code} argument, and commits the transaction with \code{\link[DBI:transactions]{DBI::dbCommit()}}. If the code raises an error, the transaction is instead aborted with \code{\link[DBI:transactions]{DBI::dbRollback()}}, and the error is propagated. If the code calls \code{dbBreak()}, execution of the code stops and the transaction is silently aborted. All side effects caused by the code (such as the creation of new variables) propagate to the calling environment. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "cash", data.frame(amount = 100)) dbWriteTable(con, "account", data.frame(amount = 2000)) # All operations are carried out as logical unit: dbWithTransaction( con, { withdrawal <- 300 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) } ) # The code is executed as if in the current environment: withdrawal # The changes are committed to the database after successful execution: dbReadTable(con, "cash") dbReadTable(con, "account") # Rolling back with dbBreak(): dbWithTransaction( con, { withdrawal <- 5000 dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal)) dbExecute(con, "UPDATE account SET amount = amount - ?", list(withdrawal)) if (dbReadTable(con, "account")$amount < 0) { dbBreak() } } ) # These changes were not committed to the database: dbReadTable(con, "cash") dbReadTable(con, "account") dbDisconnect(con) \dontshow{\}) # examplesIf} } DBI/man/dbGetRowsAffected.Rd0000644000176200001440000000747315005323731015246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbGetRowsAffected.R \name{dbGetRowsAffected} \alias{dbGetRowsAffected} \title{The number of rows affected} \usage{ dbGetRowsAffected(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbGetRowsAffected()} returns a scalar number (integer or numeric), the number of rows affected by a data manipulation statement issued with \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}. The value is available directly after the call and does not change after calling \code{\link[DBI:dbFetch]{DBI::dbFetch()}}. \code{NA_integer_} or \code{NA_numeric_} are allowed if the number of rows affected is not known. For queries issued with \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}}, zero is returned before and after the call to \code{dbFetch()}. \code{NA} values are not allowed. } \description{ This method returns the number of rows that were added, deleted, or updated by a data manipulation statement. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowsAffected")} } \section{The command execution flow}{ This section gives a complete overview over the flow for the execution of SQL statements that have side effects such as stored procedures, inserting or deleting data, or setting database or connection options. Most of this flow, except repeated calling of \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbExecute]{dbExecute()}}, which should be sufficient for non-parameterized queries. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendStatement]{dbSendStatement()}} to create a result set object of class \linkS4class{DBIResult}. For some queries you need to pass \code{immediate = TRUE}. \item Optionally, bind query parameters with\code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}} to retrieve the number of rows affected by the query. \item Repeat the last two steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ Attempting to get the rows affected for a result set cleared with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} gives an error. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbWriteTable(con, "mtcars", mtcars) rs <- dbSendStatement(con, "DELETE FROM mtcars") dbGetRowsAffected(rs) nrow(mtcars) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other command execution generics: \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbExecute}()}, \code{\link{dbSendStatement}()} } \concept{DBIResult generics} \concept{command execution generics} DBI/man/dbQuoteString.Rd0000644000176200001440000000570515005323731014512 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbQuoteString.R \name{dbQuoteString} \alias{dbQuoteString} \title{Quote literal strings} \usage{ dbQuoteString(conn, x, ...) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{x}{A character vector to quote as string.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbQuoteString()} returns an object that can be coerced to \link{character}, of the same length as the input. For an empty character vector this function returns a length-0 object. When passing the returned object again to \code{dbQuoteString()} as \code{x} argument, it is returned unchanged. Passing objects of class \link[DBI:SQL]{DBI::SQL} should also return them unchanged. (For backends it may be most convenient to return \link[DBI:SQL]{DBI::SQL} objects to achieve this behavior, but this is not required.) } \description{ Call this method to generate a string that is suitable for use in a query as a string literal, to make sure that you generate valid SQL and protect against SQL injection attacks. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbQuoteString")} } \section{Failure modes}{ Passing a numeric, integer, logical, or raw vector, or a list for the \code{x} argument raises an error. } \section{Specification}{ The returned expression can be used in a \verb{SELECT ...} query, and for any scalar character \code{x} the value of \code{dbGetQuery(paste0("SELECT ", dbQuoteString(x)))[[1]]} must be identical to \code{x}, even if \code{x} contains spaces, tabs, quotes (single or double), backticks, or newlines (in any combination) or is itself the result of a \code{dbQuoteString()} call coerced back to character (even repeatedly). If \code{x} is \code{NA}, the result must merely satisfy \code{\link[=is.na]{is.na()}}. The strings \code{"NA"} or \code{"NULL"} are not treated specially. \code{NA} should be translated to an unquoted SQL \code{NULL}, so that the query \verb{SELECT * FROM (SELECT 1) a WHERE ... IS NULL} returns one row. } \examples{ # Quoting ensures that arbitrary input is safe for use in a query name <- "Robert'); DROP TABLE Students;--" dbQuoteString(ANSI(), name) # NAs become NULL dbQuoteString(ANSI(), c("x", NA)) # SQL vectors are always passed through as is var_name <- SQL("select") var_name dbQuoteString(ANSI(), var_name) # This mechanism is used to prevent double escaping dbQuoteString(ANSI(), dbQuoteString(ANSI(), name)) } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()} } \concept{DBIResult generics} DBI/man/dbGetInfo.Rd0000644000176200001440000001070115005323731013551 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/04-DBIResult.R, R/dbGetInfo.R \name{dbGetInfo} \alias{dbGetInfo} \title{Get DBMS metadata} \usage{ dbGetInfo(dbObj, ...) } \arguments{ \item{dbObj}{An object inheriting from \linkS4class{DBIObject}, i.e. \linkS4class{DBIDriver}, \linkS4class{DBIConnection}, or a \linkS4class{DBIResult}} \item{...}{Other arguments to methods.} } \value{ For objects of class \link[DBI:DBIDriver-class]{DBI::DBIDriver}, \code{dbGetInfo()} returns a named list that contains at least the following components: \itemize{ \item \code{driver.version}: the package version of the DBI backend, \item \code{client.version}: the version of the DBMS client library. } For objects of class \link[DBI:DBIConnection-class]{DBI::DBIConnection}, \code{dbGetInfo()} returns a named list that contains at least the following components: \itemize{ \item \code{db.version}: version of the database server, \item \code{dbname}: database name, \item \code{username}: username to connect to the database, \item \code{host}: hostname of the database server, \item \code{port}: port on the database server. It must not contain a \code{password} component. Components that are not applicable should be set to \code{NA}. } For objects of class \link[DBI:DBIResult-class]{DBI::DBIResult}, \code{dbGetInfo()} returns a named list that contains at least the following components: \itemize{ \item \code{statatment}: the statement used with \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}} or \code{\link[DBI:dbExecute]{DBI::dbExecute()}}, as returned by \code{\link[DBI:dbGetStatement]{DBI::dbGetStatement()}}, \item \code{row.count}: the number of rows fetched so far (for queries), as returned by \code{\link[DBI:dbGetRowCount]{DBI::dbGetRowCount()}}, \item \code{rows.affected}: the number of rows affected (for statements), as returned by \code{\link[DBI:dbGetRowsAffected]{DBI::dbGetRowsAffected()}} \item \code{has.completed}: a logical that indicates if the query or statement has completed, as returned by \code{\link[DBI:dbHasCompleted]{DBI::dbHasCompleted()}}. } } \description{ Retrieves information on objects of class \linkS4class{DBIDriver}, \linkS4class{DBIConnection} or \linkS4class{DBIResult}. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetInfo")} } \section{Implementation notes}{ The default implementation for \verb{DBIResult objects} constructs such a list from the return values of the corresponding methods, \code{\link[=dbGetStatement]{dbGetStatement()}}, \code{\link[=dbGetRowCount]{dbGetRowCount()}}, \code{\link[=dbGetRowsAffected]{dbGetRowsAffected()}}, and \code{\link[=dbHasCompleted]{dbHasCompleted()}}. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} dbGetInfo(RSQLite::SQLite()) \dontshow{\}) # examplesIf} } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} } \concept{DBIConnection generics} \concept{DBIDriver generics} \concept{DBIResult generics} DBI/man/sqlParseVariables.Rd0000644000176200001440000000315414350241735015344 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpolate.R, R/sqlParseVariables.R \name{sqlCommentSpec} \alias{sqlCommentSpec} \alias{sqlQuoteSpec} \alias{sqlParseVariablesImpl} \alias{sqlParseVariables} \title{Parse interpolated variables from SQL.} \usage{ sqlCommentSpec(start, end, endRequired) sqlQuoteSpec(start, end, escape = "", doubleEscape = TRUE) sqlParseVariablesImpl(sql, quotes, comments) sqlParseVariables(conn, sql, ...) } \arguments{ \item{start, end}{Start and end characters for quotes and comments} \item{endRequired}{Is the ending character of a comment required?} \item{escape}{What character can be used to escape quoting characters? Defaults to \code{""}, i.e. nothing.} \item{doubleEscape}{Can quoting characters be escaped by doubling them? Defaults to \code{TRUE}.} \item{sql}{SQL to parse (a character string)} \item{quotes}{A list of \code{QuoteSpec} calls defining the quoting specification.} \item{comments}{A list of \code{CommentSpec} calls defining the commenting specification.} } \description{ If you're implementing a backend that uses non-ANSI quoting or commenting rules, you'll need to implement a method for \code{sqlParseVariables} that calls \code{sqlParseVariablesImpl} with the appropriate quote and comment specifications. } \examples{ # Use [] for quoting and no comments sqlParseVariablesImpl("[?a]", list(sqlQuoteSpec("[", "]", "\\\\", FALSE)), list() ) # Standard quotes, use # for commenting sqlParseVariablesImpl("# ?a\n?b", list(sqlQuoteSpec("'", "'"), sqlQuoteSpec('"', '"')), list(sqlCommentSpec("#", "\n", FALSE)) ) } \keyword{internal} DBI/man/DBIDriver-class.Rd0000644000176200001440000000177114602466070014602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/02-DBIDriver.R \docType{class} \name{DBIDriver-class} \alias{DBIDriver-class} \title{DBIDriver class} \description{ Base class for all DBMS drivers (e.g., RSQLite, MySQL, PostgreSQL). The virtual class \code{DBIDriver} defines the operations for creating connections and defining data type mappings. Actual driver classes, for instance \code{RPostgres}, \code{RMariaDB}, etc. implement these operations in a DBMS-specific manner. } \seealso{ Other DBI classes: \code{\link{DBIConnection-class}}, \code{\link{DBIConnector-class}}, \code{\link{DBIObject-class}}, \code{\link{DBIResult-class}}, \code{\link{DBIResultArrow-class}} Other DBIDriver generics: \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListConnections}()} } \concept{DBI classes} \concept{DBIDriver generics} DBI/man/dbAppendTable.Rd0000644000176200001440000001471515005323731014406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/11-dbAppendTable.R \name{dbAppendTable} \alias{dbAppendTable} \title{Insert rows into a table} \usage{ dbAppendTable(conn, name, value, ..., row.names = NULL) } \arguments{ \item{conn}{A \link[=DBIConnection-class]{DBI::DBIConnection} object, as returned by \code{\link[=dbConnect]{dbConnect()}}.} \item{name}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{value}{A \link{data.frame} (or coercible to data.frame).} \item{...}{Other parameters passed on to methods.} \item{row.names}{Must be \code{NULL}.} } \value{ \code{dbAppendTable()} returns a scalar numeric. } \description{ The \code{dbAppendTable()} method assumes that the table has been created beforehand, e.g. with \code{\link[=dbCreateTable]{dbCreateTable()}}. The default implementation calls \code{\link[=sqlAppendTableTemplate]{sqlAppendTableTemplate()}} and then \code{\link[=dbExecute]{dbExecute()}} with the \code{param} argument. Use \code{\link[=dbAppendTableArrow]{dbAppendTableArrow()}} to append data from an Arrow stream. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbAppendTable")} } \details{ Backends compliant to ANSI SQL 99 which use \verb{?} as a placeholder for prepared queries don't need to override it. Backends with a different SQL syntax which use \verb{?} as a placeholder for prepared queries can override \code{\link[=sqlAppendTable]{sqlAppendTable()}}. Other backends (with different placeholders or with entirely different ways to create tables) need to override the \code{dbAppendTable()} method. The \code{row.names} argument is not supported by this method. Process the values with \code{\link[=sqlRownamesToColumn]{sqlRownamesToColumn()}} before calling this method. } \section{Failure modes}{ If the table does not exist, or the new data in \code{values} is not a data frame or has different column names, an error is raised; the remote table remains unchanged. An error is raised when calling this method for a closed or invalid connection. An error is also raised if \code{name} cannot be processed with \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}} or if this results in a non-scalar. Invalid values for the \code{row.names} argument (non-scalars, unsupported data types, \code{NA}) also raise an error. Passing a \code{value} argument different to \code{NULL} to the \code{row.names} argument (in particular \code{TRUE}, \code{NA}, and a string) raises an error. } \section{Specification}{ SQL keywords can be used freely in table names, column names, and data. Quotes, commas, spaces, and other special characters such as newlines and tabs, can also be used in the data, and, if the database supports non-syntactic identifiers, also for table names and column names. The following data types must be supported at least, and be read identically with \code{\link[DBI:dbReadTable]{DBI::dbReadTable()}}: \itemize{ \item integer \item numeric (the behavior for \code{Inf} and \code{NaN} is not specified) \item logical \item \code{NA} as NULL \item 64-bit values (using \code{"bigint"} as field type); the result can be \itemize{ \item converted to a numeric, which may lose precision, \item converted a character vector, which gives the full decimal representation \item written to another table and read again unchanged } \item character (in both UTF-8 and native encodings), supporting empty strings (before and after non-empty strings) \item factor (returned as character, with a warning) \item list of raw (if supported by the database) \item objects of type \link[blob:blob]{blob::blob} (if supported by the database) \item date (if supported by the database; returned as \code{Date}) also for dates prior to 1970 or 1900 or after 2038 \item time (if supported by the database; returned as objects that inherit from \code{difftime}) \item timestamp (if supported by the database; returned as \code{POSIXct} respecting the time zone but not necessarily preserving the input time zone), also for timestamps prior to 1970 or 1900 or after 2038 respecting the time zone but not necessarily preserving the input time zone) } Mixing column types in the same table is supported. The \code{name} argument is processed as follows, to support databases that allow non-syntactic names for their objects: \itemize{ \item If an unquoted table name as string: \code{dbAppendTable()} will do the quoting, perhaps by calling \code{dbQuoteIdentifier(conn, x = name)} \item If the result of a call to \code{\link[DBI:dbQuoteIdentifier]{DBI::dbQuoteIdentifier()}}: no more quoting is done to support databases that allow non-syntactic names for their objects: } The \code{row.names} argument must be \code{NULL}, the default value. Row names are ignored. The \code{value} argument must be a data frame with a subset of the columns of the existing table. The order of the columns does not matter. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") dbCreateTable(con, "iris", iris) dbAppendTable(con, "iris", iris) dbReadTable(con, "iris") dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} } \concept{DBIConnection generics} DBI/man/sqlCreateTable.Rd0000644000176200001440000000455314602466070014621 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sqlCreateTable.R \name{sqlCreateTable} \alias{sqlCreateTable} \title{Compose query to create a simple table} \usage{ sqlCreateTable(con, table, fields, row.names = NA, temporary = FALSE, ...) } \arguments{ \item{con}{A database connection.} \item{table}{The table name, passed on to \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Options are: \itemize{ \item a character string with the unquoted DBMS table name, e.g. \code{"table_name"}, \item a call to \code{\link[=Id]{Id()}} with components to the fully qualified table name, e.g. \code{Id(schema = "my_schema", table = "table_name")} \item a call to \code{\link[=SQL]{SQL()}} with the quoted and fully qualified table name given verbatim, e.g. \code{SQL('"my_schema"."table_name"')} }} \item{fields}{Either a character vector or a data frame. A named character vector: Names are column names, values are types. Names are escaped with \code{\link[=dbQuoteIdentifier]{dbQuoteIdentifier()}}. Field types are unescaped. A data frame: field types are generated using \code{\link[=dbDataType]{dbDataType()}}.} \item{row.names}{Either \code{TRUE}, \code{FALSE}, \code{NA} or a string. If \code{TRUE}, always translate row names to a column called "row_names". If \code{FALSE}, never translate row names. If \code{NA}, translate rownames only if they're a character vector. A string is equivalent to \code{TRUE}, but allows you to override the default name. For backward compatibility, \code{NULL} is equivalent to \code{FALSE}.} \item{temporary}{If \code{TRUE}, will generate a temporary table.} \item{...}{Other arguments used by individual methods.} } \description{ Exposes an interface to simple \verb{CREATE TABLE} commands. The default method is ANSI SQL 99 compliant. This method is mostly useful for backend implementers. \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("sqlCreateTable")} } \details{ The \code{row.names} argument must be passed explicitly in order to avoid a compatibility warning. The default will be changed in a later release. } \examples{ sqlCreateTable(ANSI(), "my-table", c(a = "integer", b = "text")) sqlCreateTable(ANSI(), "my-table", iris) # By default, character row names are converted to a row_names colum sqlCreateTable(ANSI(), "mtcars", mtcars[, 1:5]) sqlCreateTable(ANSI(), "mtcars", mtcars[, 1:5], row.names = FALSE) } DBI/man/dbColumnInfo.Rd0000644000176200001440000001065315005323731014275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbColumnInfo.R \name{dbColumnInfo} \alias{dbColumnInfo} \title{Information about result types} \usage{ dbColumnInfo(res, ...) } \arguments{ \item{res}{An object inheriting from \link[=DBIResult-class]{DBI::DBIResult}.} \item{...}{Other arguments passed on to methods.} } \value{ \code{dbColumnInfo()} returns a data frame with at least two columns \code{"name"} and \code{"type"} (in that order) (and optional columns that start with a dot). The \code{"name"} and \code{"type"} columns contain the names and types of the R columns of the data frame that is returned from \code{\link[DBI:dbFetch]{DBI::dbFetch()}}. The \code{"type"} column is of type \code{character} and only for information. Do not compute on the \code{"type"} column, instead use \code{dbFetch(res, n = 0)} to create a zero-row data frame initialized with the correct data types. } \description{ Produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame describes an aspect of the result set field (field name, type, etc.) \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbColumnInfo")} } \section{The data retrieval flow}{ This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames. Most of this flow, except repeated calling of \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}, is implemented by \code{\link[=dbGetQuery]{dbGetQuery()}}, which should be sufficient unless you want to access the results in a paged way or you have a parameterized query that you want to reuse. This flow requires an active connection established by \code{\link[=dbConnect]{dbConnect()}}. See also \code{vignette("dbi-advanced")} for a walkthrough. \enumerate{ \item Use \code{\link[=dbSendQuery]{dbSendQuery()}} to create a result set object of class \linkS4class{DBIResult}. \item Optionally, bind query parameters with \code{\link[=dbBind]{dbBind()}} or \code{\link[=dbBindArrow]{dbBindArrow()}}. This is required only if the query contains placeholders such as \verb{?} or \verb{$1}, depending on the database backend. \item Optionally, use \code{\link[=dbColumnInfo]{dbColumnInfo()}} to retrieve the structure of the result set without retrieving actual data. \item Use \code{\link[=dbFetch]{dbFetch()}} to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards. \item Use \code{\link[=dbHasCompleted]{dbHasCompleted()}} to tell when you're done. This method returns \code{TRUE} if no more rows are available for fetching. \item Repeat the last four steps as necessary. \item Use \code{\link[=dbClearResult]{dbClearResult()}} to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to use \code{\link[=on.exit]{on.exit()}} or \code{\link[withr:defer]{withr::defer()}} to ensure that this step is always executed. } } \section{Failure modes}{ An attempt to query columns for a closed result set raises an error. } \section{Specification}{ A column named \code{row_names} is treated like any other column. The column names are always consistent with the data returned by \code{dbFetch()}. If the query returns unnamed columns, non-empty and non-\code{NA} names are assigned. Column names that correspond to SQL or R keywords are left unchanged. } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} con <- dbConnect(RSQLite::SQLite(), ":memory:") rs <- dbSendQuery(con, "SELECT 1 AS a, 2 AS b") dbColumnInfo(rs) dbFetch(rs) dbClearResult(rs) dbDisconnect(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbIsValid}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} } \concept{DBIResult generics} DBI/man/dbIsValid.Rd0000644000176200001440000001002315005323731013546 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dbIsValid.R \name{dbIsValid} \alias{dbIsValid} \title{Is this DBMS object still valid?} \usage{ dbIsValid(dbObj, ...) } \arguments{ \item{dbObj}{An object inheriting from \linkS4class{DBIObject}, i.e. \linkS4class{DBIDriver}, \linkS4class{DBIConnection}, or a \linkS4class{DBIResult}} \item{...}{Other arguments to methods.} } \value{ \code{dbIsValid()} returns a logical scalar, \code{TRUE} if the object specified by \code{dbObj} is valid, \code{FALSE} otherwise. A \link[DBI:DBIConnection-class]{DBI::DBIConnection} object is initially valid, and becomes invalid after disconnecting with \code{\link[DBI:dbDisconnect]{DBI::dbDisconnect()}}. For an invalid connection object (e.g., for some drivers if the object is saved to a file and then restored), the method also returns \code{FALSE}. A \link[DBI:DBIResult-class]{DBI::DBIResult} object is valid after a call to \code{\link[DBI:dbSendQuery]{DBI::dbSendQuery()}}, and stays valid even after all rows have been fetched; only clearing it with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} invalidates it. A \link[DBI:DBIResult-class]{DBI::DBIResult} object is also valid after a call to \code{\link[DBI:dbSendStatement]{DBI::dbSendStatement()}}, and stays valid after querying the number of rows affected; only clearing it with \code{\link[DBI:dbClearResult]{DBI::dbClearResult()}} invalidates it. If the connection to the database system is dropped (e.g., due to connectivity problems, server failure, etc.), \code{dbIsValid()} should return \code{FALSE}. This is not tested automatically. } \description{ This generic tests whether a database object is still valid (i.e. it hasn't been disconnected or cleared). \Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbIsValid")} } \examples{ \dontshow{if (requireNamespace("RSQLite", quietly = TRUE)) withAutoprint(\{ # examplesIf} dbIsValid(RSQLite::SQLite()) con <- dbConnect(RSQLite::SQLite(), ":memory:") dbIsValid(con) rs <- dbSendQuery(con, "SELECT 1") dbIsValid(rs) dbClearResult(rs) dbIsValid(rs) dbDisconnect(con) dbIsValid(con) \dontshow{\}) # examplesIf} } \seealso{ Other DBIDriver generics: \code{\link{DBIDriver-class}}, \code{\link{dbCanConnect}()}, \code{\link{dbConnect}()}, \code{\link{dbDataType}()}, \code{\link{dbDriver}()}, \code{\link{dbGetInfo}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbListConnections}()} Other DBIConnection generics: \code{\link{DBIConnection-class}}, \code{\link{dbAppendTable}()}, \code{\link{dbAppendTableArrow}()}, \code{\link{dbCreateTable}()}, \code{\link{dbCreateTableArrow}()}, \code{\link{dbDataType}()}, \code{\link{dbDisconnect}()}, \code{\link{dbExecute}()}, \code{\link{dbExistsTable}()}, \code{\link{dbGetException}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetQuery}()}, \code{\link{dbGetQueryArrow}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbListFields}()}, \code{\link{dbListObjects}()}, \code{\link{dbListResults}()}, \code{\link{dbListTables}()}, \code{\link{dbQuoteIdentifier}()}, \code{\link{dbReadTable}()}, \code{\link{dbReadTableArrow}()}, \code{\link{dbRemoveTable}()}, \code{\link{dbSendQuery}()}, \code{\link{dbSendQueryArrow}()}, \code{\link{dbSendStatement}()}, \code{\link{dbUnquoteIdentifier}()}, \code{\link{dbWriteTable}()}, \code{\link{dbWriteTableArrow}()} Other DBIResult generics: \code{\link{DBIResult-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbColumnInfo}()}, \code{\link{dbFetch}()}, \code{\link{dbGetInfo}()}, \code{\link{dbGetRowCount}()}, \code{\link{dbGetRowsAffected}()}, \code{\link{dbGetStatement}()}, \code{\link{dbHasCompleted}()}, \code{\link{dbIsReadOnly}()}, \code{\link{dbQuoteLiteral}()}, \code{\link{dbQuoteString}()} Other DBIResultArrow generics: \code{\link{DBIResultArrow-class}}, \code{\link{dbBind}()}, \code{\link{dbClearResult}()}, \code{\link{dbFetchArrow}()}, \code{\link{dbFetchArrowChunk}()}, \code{\link{dbHasCompleted}()} } \concept{DBIConnection generics} \concept{DBIDriver generics} \concept{DBIResult generics} \concept{DBIResultArrow generics} DBI/DESCRIPTION0000644000176200001440000000355315147513477012402 0ustar liggesusersPackage: DBI Title: R Database Interface Version: 1.3.0 Date: 2026-02-11 Authors@R: c( person("R Special Interest Group on Databases (R-SIG-DB)", role = "aut"), person("Hadley", "Wickham", role = "aut"), person("Kirill", "Müller", , "kirill@cynkra.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-1416-3412")), person("R Consortium", role = "fnd") ) Description: A database interface definition for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations. License: LGPL (>= 2.1) URL: https://dbi.r-dbi.org, https://github.com/r-dbi/DBI BugReports: https://github.com/r-dbi/DBI/issues Depends: methods, R (>= 3.0.0) Suggests: arrow, blob, callr, covr, DBItest (>= 1.8.2), dbplyr, downlit, dplyr, glue, hms, knitr, magrittr, nanoarrow (>= 0.3.0.1), otel, otelsdk, RMariaDB, rmarkdown, rprojroot, RSQLite (>= 1.1-2), testthat (>= 3.0.0), vctrs, xml2 VignetteBuilder: knitr Config/autostyle/scope: line_breaks Config/autostyle/strict: false Config/Needs/check: r-dbi/DBItest Config/Needs/website: r-dbi/DBItest, r-dbi/dbitemplate, adbi, AzureKusto, bigrquery, DatabaseConnector, dittodb, duckdb, implyr, lazysf, odbc, pool, RAthena, IMSMWU/RClickhouse, RH2, RJDBC, RMariaDB, RMySQL, RPostgres, RPostgreSQL, RPresto, RSQLite, sergeant, sparklyr, withr Config/testthat/edition: 3 Encoding: UTF-8 RoxygenNote: 7.3.3.9000 NeedsCompilation: no Packaged: 2026-02-24 17:22:33 UTC; kirill Author: R Special Interest Group on Databases (R-SIG-DB) [aut], Hadley Wickham [aut], Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd] Maintainer: Kirill Müller Repository: CRAN Date/Publication: 2026-02-25 06:31:27 UTC