## Tcl8.6.17/Tk8.6.17 Documentation > TDBC Package Commands, version 1.1.12 > tdbc_connection

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    tdbc::connection — TDBC connection object
  SYNOPSIS
  説明 DESCRIPTION
    type
    precision
    scale
    nullable
    tableCatalog
    tableSchema
    tableName
    constraintCatalog
    constraintSchema
    constraintName
    columnName
    ordinalPosition
    foreignConstraintCatalog
    foreignConstraintSchema
    foreignConstraintName
    primaryConstraintCatalog
    primaryConstraintSchema
    primaryConstraintName
    updateAction
    deleteAction
    primaryCatalog
    primarySchema
    primaryTable
    primaryColumn
    foreignCatalog
    foreignSchema
    foreignTable
    foreignColumn
    ordinalPosition
  構成設定指示項目CONFIGURATION OPTIONS
    -encoding name
    -isolation level
    -timeout ms
    -readonly flag
  TRANSACTION ISOLATION LEVELS
    readuncommitted
    readcommitted
    repeatableread
    serializable
    readonly
  SEE ALSO
  KEYWORDS
  著作権 COPYRIGHT

### NAME

tdbc::connection — TDBC connection object

### SYNOPSIS

package require tdbc 1.0
package require tdbc::driver version
tdbc::driver::connection create db ?-option value...?
db configure ?-option value...?
db close
db foreignkeys ?-primary tableName? ?-foreign tableName?
db prepare sql-code
db preparecall call
db primarykeys tableName
db statements
db resultsets
db tables ?pattern?
db columns table ?pattern?
db begintransaction
db commit
db rollback
db transaction script
db allrows ?-as lists|dicts? ?-columnsvariable name? ?--? sql-code ?dictionary?
db foreach ?-as lists|dicts? ?-columnsvariable name? ?--? varName sqlcode ?dictionary? script

### 説明 DESCRIPTION

TDBC (Tcl DataBase Connectivity) の為の全ての基礎データ駆動譜は､基礎データへの接続を具現している 接続 対象を実装する｡慣例により､この対象は､命令 tdbc::driver::connection create により生成される｡この命令は､接続を具現する Tcl 命令の名前と使用可能な指示項目の群を､受入れる(CONFIGURATION OPTIONS の節を参照されたい)｡そして､基礎データへの接続を確立し､新しく生成したTcl 命令の名前を返す｡　　　　　　 Every database driver for TDBC (Tcl DataBase Connectivity) implements a connection object that represents a connection to a database. By convention, this object is created by the command, tdbc::driver::connection create. This command accepts the name of a Tcl command that will represent the connection and a possible set of options (see CONFIGURATION OPTIONS). It establishes a connection to the database and returns the name of the newly-created Tcl command.

基礎データ接続上の configure 対象命令はもし､引数なしで現れると､代わりの用語と､現在の接続の構成設定を表す値とのリストを返す｡もし一つの引数 -option と共に現れると､与えられた指示項目の構成設定設定値を返す｡それ以外は､それは､偶数個の引数を与えなければならず､それは､変更するための指示項目と値である｡指定された項目は指定された値を受取るが､返り値はない｡ 　　 The configure object command on a database connection, if presented with no arguments, returns a list of alternating keywords and values representing the connection's current configuration. If presented with a single argument -option, it returns the configured value of the given option. Otherwise, it must be given an even number of arguments which are alternating options and values. The specified options receive the specified values, and nothing is returned.

基礎データ接続上の close 対象命令は接続を閉じる｡接続上の､全ての活動中の命令文と結果の組は閉じられる｡取り掛かれてないどの一括処理も巻き戻される｡対象命令は削除される｡　　　　　　　　　　 　　 The close object command on a database connection closes the connection. All active statements and result sets on the connection are closed. Any uncommitted transaction is rolled back. The object command is deleted.

基礎データ接続上の prepare 対象命令は､実行する為の SQL命令文を準備する｡ sql-code 引数は実行される筈の SQL 命令文を一つ含まねばならない｡束縛変数は含まれても好い｡返り値は新しく生成された Tcl 命令であって､この命令を具現する｡ prepare 対象命令に受入れられた SQL と､命令文によって受入れられる対話機能の更なる詳細な論議については tdbc::statement を参照されたい｡　　　　　　 The prepare object command on a database connection prepares a SQL statement for execution. The sql-code argument must contain a single SQL statement to be executed. Bound variables may be included. The return value is a newly-created Tcl command that represents the statement. See tdbc::statement for more detailed discussion of the SQL accepted by the prepare object command and the interface accepted by a statement.

土台になっている基礎データと駆動譜が保存された手続函数を運営している､基礎データ接続上では､preparecall 対象命令は､実行の為に保存された手続函数を呼出す準備をする｡保存された手続函数を呼出す構文は以下の通り: 　　　　　　 　　 On a database connection where the underlying database and driver support stored procedures, the preparecall object command prepares a call to a stored procedure for execution. The syntax of the stored procedure call is:

    ?resultvar =? procname(?arg ?, arg...?)

返り値は､命令文を具現して新しく生成された Tcl 命令である｡ 命令文に受入れられる対話機能については､tdbc::statement を参照されたい｡　　　　　　 The return value is a newly-created Tcl command that represents the statement. See tdbc::statement for the interface accepted by a statement.

statements 対象命令は､与えられ且つ閉じられていない接続に対する prepare や preparecall 命令文によって生成された命令文のリストを返す｡　　　　　　 The statements object command returns a list of statements that have been created by prepare and preparecall statements against the given connection and have not yet been closed.

resultsets 対象命令は､与えられ､閉じられてない接続を使って準備された実行命令文によって得られる結果のリストを返す｡ 　　　　　　 The resultsets object command returns a list of result sets that have been obtained by executing statements prepared using the given connection and not yet closed.

tables 対象命令は､基礎データ内に実在する名前の表について接続に問合せることを算譜に許容する｡指示項目の pattern 假引数は､表の名前に引合せる為の紋様である｡それは SQL の万能文字 '%' と､その値が副辞書である and を含めることができる｡ 値の解釈実行の為の個別の基礎データ駆動譜の為の説明書を参照されたい｡ 　　 The tables object command allows the program to query the connection for the names of tables that exist in the database. The optional pattern parameter is a pattern to match the name of a table. It may contain the SQL wild-card characters '%' and and whose values are subdictionaries. See the documentation for the individual database driver for the interpretation of the values.

columns 対象命令は､与えられた表内に存在する欄の名前について､接続に問合せることを､算譜に許容する｡指示項目の pattern 假引数は欄の名前に引合せるための紋様である｡それは SQL の万能文字 '%' と､その値が副辞書である and を含めることができる｡ それぞれの副辞書は少なくとも次の用語と値を含む(及び､その使用法が固有の基礎データ駆動譜によって定められた他のものを含むかもしれない)｡　　　　　　　 The columns object command allows the program to query the connection for the names of columns that exist in a given table. The optional pattern parameter is a pattern to match the name of a column. It may contain the SQL wild-card characters '%' and and whose values are dictionaries. Each of the subdictionaries will contain at least the following keys and values (and may contain others whose usage is determined by a specific database driver).

type
  欄のデータ型を含み､一般に次の群から選定される bigint, binary, bit, char, date, decimal, double, float, integer, longvarbinary, longvarchar, numeric, real, time, timestamp, smallint, tinyint, varbinary, varchar (もし､欄が上述の一つで表せない型を有する場合､typeは駆動譜依存の型の記述を含む)｡　　　　　　 Contains the data type of the column, and will generally be chosen from the set, bigint, binary, bit, char, date, decimal, double, float, integer, longvarbinary, longvarchar, numeric, real, time, timestamp, smallint, tinyint, varbinary, and varchar. (If the column has a type that cannot be represented as one of the above, type will contain a driver-dependent description of the type.)

precision
  欄の精度を含む､単位は型に従って､ビット､十進数､文字の巾である｡　　　　　 Contains the precision of the column in bits, decimal digits, or the width in characters, according to the type.

scale
  桁の概念を運営している型の為に､欄の桁(小数点の後ろの十進数の個数)を含む｡　　　　　　　 Contains the scale of the column (the number of digits after the radix point), for types that support the concept.

nullable
  もし欄が NULL 値を含むことができる場合は 1 を､そうでない場合は 0 を含む｡　　　　　　 Contains 1 if the column can contain NULL values, and 0 otherwise.

primarykeys 対象命令は､与えられた表に属する一次検索用語について､接続に問合せる事を､算譜に許容する｡ tableName 假引数は､尋問されている表を識別する｡ 結果は辞書のリストであり､検索用語を数え上げる($connection allrows -as dicts によって返されるリストに似た書式で)｡ 辞書の検索用語は少なくとも次の者を含んでいる｡ NULL や､与えられた基礎データ内で意味のない値は省略されている｡　　　　　　　 The primarykeys object command allows the program to query the connection for the primary keys belonging to a given table. The tableName parameter identifies the table being interrogated. The result is a list of dictionaries enumerating the keys (in a similar format to the list returned by $connection allrows -as dicts). The keys of the dictionary may include at least the following. Values that are NULL or meaningless in a given database are omitted.

tableCatalog
  その中に表が表れる型録の名前｡　　　　　　 Name of the catalog in which the table appears.

tableSchema
  その中に表が表れる図式の名前｡　　　　　 Name of the schema in which the table appears.

tableName
  一次検索用語を所有する表の名前｡　　　　　 Name of the table owning the primary key.

constraintCatalog
  その中に一次検索用語の拘束が表れる型録の名前｡ ある基礎データ内では､これは表の型録と同じでないかもしれない｡　　　　　 Name of the catalog in which the primary key constraint appears. In some database systems, this may not be the same as the table's catalog.

constraintSchema
  その中に一次検索用語の拘束が表れる図式の名前｡ ある基礎データ内では､これは表の図式と同じでないかもしれない｡　　　　　 　　 Name of the schema in which the primary key constraint appears. In some database systems, this may not be the same as the table's schema.

constraintName
  一次検索用語の拘束の名前｡　　　　　 Name of the primary key constraint,

columnName
  一次検索用語の要員である欄の名前｡　　　　　 Name of a column that is a member of the primary key.

ordinalPosition
  一次検索用語の内部の欄の通常の位置｡　　　　　 Ordinal position of the column within the primary key.

特定の基礎データ系に固有の追加的なものが､これ等の欄に追加されるかもしれない｡　　　　　　 To these columns may be added additional ones that are specific to a particular database system.

foreignkeys 対象命令は､特定の表を適用する外来の検索用語の関連性について､接続に問合せることを算譜に許容する｡ 関連性は､特定の表(-foreign tableName)に現れる検索用語か､特定の表(-primary tableName)を参照する検索用語か､その両方に､拘束されるかもしれない｡ 少なくとも､-primary と -foreign の内の一つが指定されるべきである､但し､ある駆動譜は､もし両方の指定が省略されている場合､現在の型録内の全ての外来の検索用語を数え上げる｡ foreignkeys 対象命令の結果は辞書のリストであり､それは､検索用語につき一つのリスト要素になっている($connection allrows -as dicts によって返されるリストに似た書式である)｡ 辞書の検索用語は少なくとも次の者を含んでいる｡ NULL や､与えられた基礎データ内で意味のない値は省略されている｡　　　　　　　 The foreignkeys object command allows the program to query the connection for foreign key relationships that apply to a particular table. The relationships may be constrained to the keys that appear in a particular table (-foreign tableName), the keys that refer to a particular table (-primary tableName), or both. At least one of -primary and -foreign should be specified, although some drivers will enumerate all foreign keys in the current catalog if both options are omitted. The result of the foreignkeys object command is a list of dictionaries, with one list element per key (in a similar format to the list returned by $connection allrows -as dicts). The keys of the dictionary may include at least the following. Values that are NULL or meaningless in a given database are omitted.

foreignConstraintCatalog
  その中に外来の検索用語の拘束が表れる型録｡　　　　　 Catalog in which the foreign key constraint appears.

foreignConstraintSchema
  その中に外来の検索用語の拘束が表れる図表｡　　　　　 Schema in which the foreign key constraint appears.

foreignConstraintName
  外来の検索用語の拘束の名前｡　　　　　 Name of the foreign key constraint.

primaryConstraintCatalog
  外来の検索用語が参照している欄上の外来の検索用語の拘束を保有する型録(又は重複のない検索用語の拘束)｡　　　　　 Catalog holding the primary key constraint (or unique key constraint) on the column to which the foreign key refers.

primaryConstraintSchema
  外来の検索用語が参照している欄上の主検索用語の拘束を保有する図表(又は重複のない検索用語の拘束)｡　　　　　　 Schema holding the primary key constraint (or unique key constraint) on the column to which the foreign key refers.

primaryConstraintName
  外来の検索用語が参照している欄上の主検索用語の名前(又は重複のない検索用語の拘束)｡　　　　　 Name of the primary key constraint (or unique key constraint) on the column to which the foreign key refers.

updateAction
  UPDATE 命令文が拘束を無効にする時にとる振舞い｡ その値は､CASCADE か SET DEFAULT か SET NULL か RESTRICT　か NO ACTION である｡　　　　　　 Action to take when an UPDATE statement invalidates the constraint. The value will be CASCADE, SET DEFAULT, SET NULL, RESTRICT, or NO ACTION.

deleteAction
  DELETE 命令文が拘束を無効にする時にとる振舞い｡ その値は､CASCADE か SET DEFAULT か SET NULL か RESTRICT か NO ACTIONである｡　　　　　　 Action to take when a DELETE statement invalidates the constraint. The value will be CASCADE, SET DEFAULT, SET NULL, RESTRICT, or NO ACTION.

primaryCatalog
  其処に一次の(それを外来の検索用語が参照している)表が現れる型録の名前｡　　　　　 Catalog name in which the primary table (the one to which the foreign key refers) appears.

primarySchema
  其処に一次の(それを外来の検索用語が参照している)表が現れる図表の名前｡　　　　　 Schema name in which the primary table (the one to which the foreign key refers) appears.

primaryTable
  一次の表(外来の検索用語が参照しているものの一つ)の名前の表｡　　　　　　 Table name of the primary table (the one to which the foreign key refers).

primaryColumn
  外来の検索用語が参照してい欄の名前｡　　　　　 Name of the column to which the foreign key refers.

foreignCatalog
  型録の名前の名前であって､その中に外来の検索用語が現れる表を含む｡　　　　　 　 Name of the catalog in which the table containing the foreign key appears.

foreignSchema
  図表の名前の名前であって､その中に外来の検索用語が現れる表を含む｡　　　　　 Name of the schema in which the table containing the foreign key appears.

foreignTable
  外来の検索用語を含む表の名前｡　　　　　 Name of the table containing the foreign key.

foreignColumn
  外来の検索用語の中に現れる欄の名前｡　　　　　 Name of the column appearing in the foreign key.

ordinalPosition
  もし検索用語が合成検索用語の場合､外来の検索用語の中の欄の位置｡　　　　　 Position of the column in the foreign key, if the key is a compound key.

基礎データ接続上の begintransaction 対象命令は､基礎データ上の一括処理を始める｡ もし､基礎になっている基礎データが､非分割の､首尾一貫した､独立した､永続的な一括処理を運営していない場合､begintransaction 対象命令は､その事実を報告する不都合を返す｡ 同様に､もし commit や rollback 命令の介在なしに 多重の begintransaction 対象命令が実行されていると､基礎になっている基礎データが入れ子の一括処理を運営していない限り､不都合を返す｡　　　　　　　 The begintransaction object command on a database connection begins a transaction on the database. If the underlying database does not support atomic, consistent, isolated, durable transactions, the begintransaction object command returns an error reporting the fact. Similarly, if multiple begintransaction commands are executed withough an intervening commit or rollback command, an error is returned unless the underlying database supports nested transactions.

基礎データ接続上の commit 対象命令は最も最近の begintransaction によって始まった一括処理を終了し､基礎データに変更を委託する｡　　　　　　 The commit object command on a database connection ends the most recent transaction started by begintransaction and commits changes to the database.

基礎データ接続上の rollback 対象命令は､最も最近の begintransaction によって始まった一括処理を巻き戻す｡ 基礎データの状態は一括処理処理の間､恰も何も起っていないようである｡　　　　　　 The rollback object command on a database connection rolls back the most recent transaction started by begintransaction. The state of the database is as if nothing happened during the transaction.

基礎データ接続上の transaction 対象命令は､基礎データ一括処理をまとめる単純な方法を代表する｡ それは､一括処理を開始し､供給された記述譜引数を Tcl 記述譜として呼出し者の有効範囲内で評価する｡ もし､記述譜が､正常か､break か continue か return かで終了すると､その一括処理はその後処理がゆだねられる(break か continue か return かによって要求される何かの振舞いが行われる)｡もし､何かの理由で後処理の委託が失敗すると､後処理の委託の不具合が､記述譜の不具合として扱われる｡記述譜内､又は処理委託内の不具合の場合､一括処理は巻き戻され､不具合が再度発信される｡記述譜からの､どのような非標準の返り符号も､一括処理は巻き戻され､そして再発信される事になる｡　　　　　　　 The transaction object command on a database connection presents a simple way of bundling a database transaction. It begins a transaction, and evaluates the supplied script argument as a Tcl script in the caller's scope. If script terminates normally, or by break, continue, or return, the transaction is committed (and any action requested by break, continue, or return takes place). If the commit fails for any reason, the error in the commit is treated as an error in the script. In the case of an error in script or in the commit, the transaction is rolled back and the error is rethrown. Any nonstandard return code from the script causes the transaction to be rolled back and then is rethrown.

allrows 対象命令は､基礎データに対して実行する SQL 命令文(sql-code 假引数として与えられる)を準備する｡ 次にそれは､束縛変数を与える追加指示の dictionary 假引数により実行(詳細は tdbc::statement を参照されたい)される｡ 最後に､結果のリストを組上げる為に､結果の群の上で allrows 対象命令を使う(tdbc::resultset を参照のこと)｡ 最後に､結果の群と命令文の両方が閉じられる｡ 返り値は結果のリストである｡　　　　　　　 The allrows object command prepares a SQL statement (given by the sql-code parameter) to execute against the database. It then executes it (see tdbc::statement for details) with the optional dictionary parameter giving bind variables. Finally, it uses the allrows object command on the result set (see tdbc::resultset) to construct a list of the results. Finally, both result set and statement are closed. The return value is the list of results.

foreach 対象命令は､基礎データに対して実行する SQL 命令文(sql-code 假引数として与えられる)を準備する｡ 次にそれは､変数を与える､追加指示の辞書 dictionary 假引数により実行(詳細は tdbc::statement を参照されたい)される｡ 最後に､それぞれの結果の並びに対して与えられた script を評価する為に､結果の組の上で foreach 対象命令を使う(tdbc::resultset を参照のこと)｡ 最後に､縦え､与えられた script が return､不都合､普通でない返り符号が与えられても結果の組と命令文の両方が閉じられる｡　　　　　　 The foreach object command prepares a SQL statement (given by the sql-code parameter) to execute against the database. It then executes it (see tdbc::statement for details) with the optional dictionary parameter giving bind variables. Finally, it uses the foreach object command on the result set (see tdbc::resultset) to evaluate the given script for each row of the results. Finally, both result set and statement are closed, even if the given script results in a return, an error, or an unusual return code.

### 構成設定指示項目CONFIGURATION OPTIONS

接続が生成される時､構成設定指定が受入れられ､又､接続の configure 対象命令は次の項目と､その他に基礎データ駆動譜に固有の項目を含む｡　　　　　　　　　　　 The configuration options accepted when the connection is created and on the connection's configure object command include the following, and may include others specific to a database driver.

-encoding name
  基礎データへの接続に使用される文字符号を指定する｡ name は encoding 命令に受入れられる名前の一つであるべきである｡ この追加設定は通常不必要である､大部分の基礎データ駆動譜は自身で使っている文字符号を把握することができる｡　　　　　　 Specifies the encoding to be used in connecting to the database. The name should be one of the names accepted by the encoding command. This option is usually unnecessary; most database drivers can figure out the encoding in use by themselves.

-isolation level
  基礎データ上の一括処理の為に必要とされる処理の分離水準を指定する｡ 水準 level に受入れられる値は下の TRANSACTION ISOLATION LEVELS に示されている｡　　　　　　 Specifies the transaction isolation level needed for transactions on the database. The acceptable values for level are shown under TRANSACTION ISOLATION LEVELS.

-timeout ms
  不都合を呼出し側に報告する前に､基礎データ操作機能譜の為に待つ最大時間を指定する｡ 厘秒 ms 引数は千分の１秒単位の最大値を与える｡ 零(無為設定)の値は､呼出し課程が基礎データ操作の為に､無限に待つことを指定する｡　　　　　　 Specifies the maximum time to wait for a an operation database engine before reporting an error to the caller. The ms argument gives the maximum time in milliseconds. A value of zero (the default) specifies that the calling process is to wait indefinitely for database operations.

-readonly flag
  接続が基礎データを修正することはないか(論理假引数 flag が真値の場合)､基礎データを修正してもよいか(flag が偽値の場合)､を指定する｡ flag が真値であれば､この指示項目は一括処理分離水準を 読出し専用 readonly に引上げる効果を有する｡ 　　　　　　 Specifies that the connection will not modify the database (if the Boolean parameter flag is true), or that it may modify the database (if flag is false). If flag is true, this option may have the effect of raising the transaction isolation level to readonly.

#### TRANSACTION ISOLATION LEVELS

-isolation 構成設定指定に受入れられる値は次の通り: 　　　　　 The acceptable values for the -isolation configuration option are as follows:

readuncommitted
  "(汚れた) dirty"､即ち､委託されていないデータを読む為の一括処理を許容する｡この分離水準はデータの完全性を疵付けて､外来検索用語や一意性の拘束を満すことは保障されない､又一般にデータの一貫性は保障されない｡　　　　　　 Allows the transaction to read "dirty", that is, uncommitted data. This isolation level may compromise data integrity, does not guarantee that foreign keys or uniqueness constraints are satisfied, and in general does not guarantee data consistency.

readcommitted
  "(汚れた) dirty" データの読出しに基く一括処理を禁じるが､読出しの繰返しを保障しない; 与えられた時刻に､一括処理が基礎データの列を読み出した場合に､同じ一括処理内で､後の時刻に同じ列を利用できる事を保障しない｡　　　　　　 Forbids the transaction from reading "dirty" data, but does not guarantee repeatable reads; if a transaction reads a row of a database at a given time, there is no guarantee that the same row will be available at a later time in the same transaction.

repeatableread
  基礎データのどの列も､一たび読み出すと､一括処理の寿命内では､同じ値を有することを保証する｡ 依然として "phantom reads"(それは､もし､二回目に表が問合されると､新しく追加された列が現れる)を許可する｡　　　　　　 Guarantees that any row of the database, once read, will have the same values for the life of a transaction. Still permits "phantom reads" (that is, newly-added rows appearing if a table is queried a second time).

serializable
  最も拘束された(又､最も高価な)一括処理分離水準｡ 基礎データへのどのような問合せも､もし繰返されると､一括処理の寿命の間､まさに､恰も一括処理は使用者専用の基礎データのみを使っているかのように､正確に同じ結果が返される｡　　　　　　　 The most restrictive (and most expensive) level of transaction isolation. Any query to the database, if repeated, will return precisely the same results for the life of the transaction, exactly as if the transaction is the only user of the database.

readonly
  serializable の様に振舞い､その中では､一括処理が始まる前に委託された結果のみが一括処理から見える､しかし基礎データの修正に基く処理は禁止されている｡　　　　　　 Behaves like serializable in that the only results visible to the transaction are those that were committed prior to the start of the transaction, but forbids the transaction from modifying the database.

これ等の分離水準の一つを実装していない基礎データでは､次の更に拘束された水準が使われることになる｡ もし与えられた分離の水準が得られない場合､その基礎データ対話処理機能はその事実を報告する不都合を発信する｡ 無為設定の分離水準は 予約読出し readcommitted である｡　　　　　　 A database that does not implement one of these isolation levels will instead use the next more restrictive isolation level. If the given level of isolation cannot be obtained, the database interface throws an error reporting the fact. The default isolation level is readcommitted.

A script should not the isolation level when a transaction is in progress.

### SEE ALSO

encoding, tdbc, tdbc::resultset, tdbc::statement, tdbc::tokenize

### KEYWORDS

TDBC, SQL, database, connectivity, connection, resultset, statement

### 著作権 COPYRIGHT

Copyright (c) 2008 by Kevin B. Kenny.
Copyright © 2008 by Kevin B. Kenny.