forked from jeremyevans/sequel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGELOG
3602 lines (1804 loc) · 147 KB
/
CHANGELOG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
=== HEAD
* No longer use CASCADE by default when dropping tables on PostgreSQL (jeremyevans)
* Support :cascade option to #drop_table, #drop_view, #drop_column, and #drop_constraint for using CASCADE (jeremyevans)
* If validation error messages are LiteralStrings, don't add the column name to them in Errors#full_messages (jeremyevans)
* Fix bug loading plugins on 1.9 where ::ClassMethods, ::InstanceMethods, or ::DatasetMethods is defined (jeremyevans)
* Add Dataset#exclude_where and Dataset#exclude_having methods, so you can force use of having or where clause (jeremyevans)
* Allow Dataset#select_all to take table name arguments and select all columns from each given table (jeremyevans)
* Add Dataset#select_group method, for selecting and grouping on the same columns (jeremyevans)
* Allow Dataset#group and Dataset#group_and_count to accept a virtual row block (jeremyevans)
=== 3.24.1 (2011-06-03)
* Ignore index creation errors if using create_table? with the IF NOT EXISTS syntax (jeremyevans) (#362)
=== 3.24.0 (2011-06-01)
* Add prepared_statements_association plugin, for using prepared statements by default for regular association loading (jeremyevans)
* Add prepared_statements_safe plugin, for making prepared statement use with models more safe (jeremyevans)
* Add prepared_statements_with_pk plugin, for using prepared statements for dataset lookups by primary key (jeremyevans)
* Fix bug in emulated prepared statement support not supporting nil or false as bound values (jeremyevans)
* Add Dataset#unbind for unbinding values from a dataset, for use with creating prepared statements (jeremyevans)
* Add prepared_statements plugin for using prepared statements for updates, inserts, deletes, and lookups by primary key (jeremyevans)
* Make Dataset#[] for model datasets consider a single integer argument as a lookup by primary key (jeremyevans)
* Add Dataset#with_pk for model datasets, for finding first record with matching primary key value (jeremyevans)
* Add defaults_setter plugin for setting default values when initializing model instances (jeremyevans)
* Add around hooks (e.g. around_save) to Sequel::Model (jeremyevans)
* Add Model#initialize_set private method to ease extension writing (jeremyevans)
* Only typecast bit fields to booleans on MSSQL, the MySQL bit type is a bitfield, not a boolean (jeremyevans)
* Set SQL_AUTO_IS_NULL=0 by default when connecting to MySQL via the swift and jdbc adapters (jeremyevans)
* Fix bug in multiple column IN/NOT IN emulation when a model dataset is used (jeremyevans)
* Add support for filtering and excluding by association datasets (jeremyevans)
* Fix literalization of boolean values in filters on SQLite and MSSQL (jeremyevans)
* Add support for filtering and excluding by multiple associations (jeremyevans)
* Add support for inverting some SQL::Constant instances such as TRUE, FALSE, NULL, and NOTNULL (jeremyevans)
* Add support for excluding by associations to model datasets (jeremyevans)
* The Sequel::Postgres.use_iso_date_format setting now only affects future Database objects (jeremyevans)
* Add Sequel::Postgres::PG_NAMED_TYPES hash for extensions to register type conversions for non-standard types (jeremyevans, pvh)
* Make create_table? use IF NOT EXISTS instead of using SELECT to determine existence, if supported (jeremyevans)
* Fix bug in association_pks plugin when associated table has a different primary key column name (jfirebaugh)
* Fix limiting rows when connecting to DB2 (semmons99)
* Exclude columns from tables in the INFORMATION_SCHEMA when parsing table schema on JDBC (jeremyevans)
* Fix limiting rows when connecting to Microsoft Access (jeremyevans)
* Add Database#views for getting an array of symbols of view names for the database (jeremyevans, christian.michon)
* Make Datbase#tables no longer include view names on MySQL (jeremyevans)
* Convert Java CLOB objects to ruby strings when using the JDBC JTDS subadapter (christian.michon)
* If Thread#kill is called on a thread with an open transaction, roll the transaction back on ruby 1.8 and rubinius (jeremyevans)
* Split informix adapter into shared/specific parts, add JDBC informix subadapter (jeremyevans)
=== 3.23.0 (2011-05-02)
* Migrate issue tracker from Google Code to GitHub Issues (jeremyevans)
* Add support for filtering by associations to model datasets (jeremyevans)
* Don't call insert_select when saving a model that doesn't select all columns of the table (jeremyevans)
* Fix bug when using :select=>[] option for a many_to_many association (jeremyevans)
* Add a columns_introspection extension that attempts to skip database queries by introspecting selected columns (jeremyevans)
* When combining old integer migrations and new timestamp migrations, make sure old integer migrations are all applied first (jeremyevans)
* Support dynamic callbacks to customize regular association loading at query time (jeremyevans)
* Support cascading of eager loading with dynamic callbacks for both eager and eager_graph (jeremyevans)
* Make the xml_serializer plugin handle namespaced models by using __ instead of / as a separator (jeremyevans)
* Allow the :eager_grapher association proc to accept a single hash instead of 3 arguments (jfirebaugh)
* Support dynamic callbacks to customize eager loading at query time (jfirebaugh, jeremyevans)
* Fix bug in the identity_map plugin for many_to_one associations when the association reflection hadn't been filled in yet (funny-falcon)
* Add serialization_modification_detection plugin for detecting changes in serialized columns (jeremyevans) (#333)
=== 3.22.0 (2011-04-01)
* Add disconnect detection to tinytds adapter, though correct behavior may require an update to tiny_tds (cult_hero)
* Add Dataset/Database#mssql_unicode_strings accessor when connecting to MSSQL to control string literalization (semmons99, jeremyevans)
* Fix ODBC::Time instance handling in the odbc adapter (jeremyevans)
* Use Sequel.application_timezone when connecting in the oracle adapter to set the connection's session's timezone (jmthomas)
* In the ADO adapter, assume access to SQL Server if a :conn_string option is given that doesn't indicate Access/Jet (damir.si) (#332)
* Use the correct class when loading instances for descendents of model classes that use single table inheritance (jeremyevans)
* Support for COLLATE in column definitions (jfirebaugh)
* Don't use a schema when creating a temporary table (jeremyevans)
* Make migrator work correctly when a default_schema is set (jeremyevans) (#331)
=== 3.21.0 (2011-03-01)
* Make symbol splitting (:table__column___alias) work correctly for identifiers that are not in the \w character class (authorNari)
* Enable row locks in Oracle (authorNari)
* Prefer cover? over include? for validates_includes/validates_inclusion_of (jeremyevans)
* Make using NULL/NOT NULL, DEFAULT, and UNIQUE column options work correctly on H2 and possibly Oracle (jeremyevans)
* Make bin/sequel accept file arguments and work correctly when $stdin is not a tty (jeremyevans)
* Add support for -I and -r options to bin/sequel (jeremyevans)
* Sequel::Model.plugin can now be overridden just like the other Model methods (jeremyevans)
* Add tinytds adapter, the best way to connect to MSSQL from a C based ruby running on *nix (jeremyevans)
* Recognize bigint unsigned as a Bignum type in the schema dumper (gamespy-tech) (#327)
* Add Dataset#calc_found_rows for MySQL datasets (macks)
* Add association_autoreloading plugin for clearing association cache when foreign key value changes (jfirebaugh, jeremyevans)
* Fix join_table on MySQL ignoring the block (jfirebaugh)
* Transfer CTE WITH clauses in subselect to main query when joining on MSSQL (jfirebaugh)
* Make specs support both RSpec 1 and RSpec 2 (jeremyevans)
* Work with ruby-informix versions >= 0.7.3 in the informix adapter (jeremyevans) (#326)
=== 3.20.0 (2011-02-01)
* Allow a :partial option to Database#indexes on MySQL to include partial indexes (roland.swingler) (#324)
* Add a SQLite subadapter to the swift adapter, now that swift supports it (jeremyevans)
* Update swift adapter to support swift 0.8.1, older versions no longer supported (jeremyevans)
* Allow setting arbitrary JDBC properties in the jdbc adapter with the :jdbc_properties option (jeremyevans)
* Use a better error message if a validates_max_length validation is applied to a nil value (jeremyevans) (#322)
* Add some basic Microsoft Access support to the ado adapter, autoincrementing primary keys now work (jeremyevans)
* Make class_table_inheritance plugin handle subclass associations better (jeremyevans) (#320)
=== 3.19.0 (2011-01-03)
* Handle Date and DateTime types in prepared statements when using the jdbc adapter (jeremyevans)
* Handle Date, DateTime, Time, SQL::Blob, true, and false in prepared statements when using the SQLite adapter (jeremyevans)
* Use varbinary(max) instead of image for the generic blob type on MSSQL (jeremyevans)
* Close prepared statements when disconnecting when using SQLite (jeremyevans)
* Allow reflecting on validations in the validation_class_methods plugin (jeremyevans)
* Allow passing a primary key value to the add_* association method (gucki)
* When typecasting model column values, check the classes of the new and existing values (jeremyevans)
* Improve type translation performance in the postgres, mysql, and sqlite adapters by using methods instead of procs (jeremyevans)
=== 3.18.0 (2010-12-01)
* Allow the user to control how the connection pool deals with attempts to access shards that aren't configured (jeremyevans)
* Typecast columns when creating model objects from JSON in the json_serializer plugin (jeremyevans)
* When parsing the schema for a model that uses an aliased table, use the unaliased table name (jeremyevans)
* When emulating schema methods such as drop_column on SQLite, recreate applicable indexes on the recreated table (jeremyevans)
* Only remove hook pairs that have been run successfully in the instance_hooks plugin (jeremyevans)
* Add reversible migration support to the migration extension (jeremyevans)
* Add to_dot extension, for producing visualizations of Dataset abstract syntax trees with Graphviz (jeremyevans)
* Switch to using manual type translation in the SQLite adapter (jeremyevans)
* Support :read_timeout option in the native mysql adapter (tmm1)
* Support :connect_timeout option in the native mysql and mysql2 adapters (tmm1)
=== 3.17.0 (2010-11-05)
* Ensure that the optimistic locking plugin increments the lock column when using Model#modified! (jfirebaugh)
* Correctly handle nil values in the xml_serializer plugin, instead of converting them to empty strings (george.haff) (#313)
* Use a default wait_timeout that's allowed on Windows for the mysql and mysql2 adapters (jeremyevans) (#314)
* Add support for connecting to MySQL over SSL using the :sslca, :sslkey, and related options (jeremyevans)
* Fix Database#each_server when used with jdbc or do connection strings without separate :adapter option (jeremyevans) (#312)
* Much better support in the AS400 JDBC subadapter (bhauff)
* Allow cloning of many_through_many associations (gucki, jeremyevans)
* In the nested_attributes plugin, don't make unnecessary update calls to modify associated objects that are about to be deleted (jeremyevans, gucki)
* Allow Dataset#(add|set)_graph_aliases to accept as hash values symbols and arrays with a single element (jeremyevans)
* Add Databse#views and #view_exists? to the Oracle adapter (gpheruson)
* Add Database#sql_log_level for changing the level at which SQL queries are logged (jeremyevans)
* Remove unintended use of prepared statements in swift adapter (jeremyevans)
* Fix logging in the swift PostgreSQL subadapter (jeremyevans)
=== 3.16.0 (2010-10-01)
* Support composite foreign keys for associations in the identity_map plugin (harukizaemon, jeremyevans) (#310)
* Handle INTERSECT and EXCEPT on Microsoft SQL Server 2005+ (jfirebaugh)
* Add :replace option to Database#create_language in the postgresql adapter (jeremyevans)
* Make rcte_tree plugin work when not all columns are selected (jeremyevans)
* Add swift adapter (jeremyevans)
* Fix literalization of DateTime objects on 1.9 for databases that support fractional seconds (jeremyevans)
=== 3.15.0 (2010-09-01)
* Make emulated alter_table tasks on SQLite correctly preserve foreign keys (DirtYiCE, jeremyevans)
* Add support for sequel_pg to the native postgres adapter when pg is used (jeremyevans)
* Make class MyModel < Sequel::Model(DB[:table]) reload safe (jeremyevans)
* Fix a possible error when using the do (DataObjects) adapter with postgres (jeremyevans)
* Handle a many_to_many :join_table option that uses an implicit alias (mluu, jeremyevans)
* Work around bug in Microsoft's SQL Server JDBC Adapter version 3.0 (jfirebaugh)
* Make eager graphing a model that uses an aliased table name work correctly (jeremyevans)
* Make class_table_inheritance plugin work with non integer primary keys on SQLite (jeremyevans, russm)
* Add :auto_increment field to column schema values on MySQL if the column is auto incrementing (dbd)
* Handle DSN-less ODBC connections better (Ricardo Ramalho)
* Exclude temporary tables when parsing the schema on PostgreSQL (jeremyevans) (#306)
* Add Mysql2 adapter (brianmario)
* Handle Mysql::Error exceptions when disconnecting in the MySQL adapter (jeremyevans)
* Make typecasting work correctly for attributes loaded lazily when using the lazy attributes plugin (jeremyevans)
=== 3.14.0 (2010-08-02)
* Handle OCIInvalidHandle errors when disconnecting in the Oracle adapter (jeremyevans)
* Allow calling Model.create_table, .create_table! and .create_table? with blocks containing the schema in the schema plugin (jfirebaugh)
* Fix handling of a :conditions options in the rcte plugin (mluu)
* Fix aggregate methods such as Dataset#sum and #avg on MSSQL on datasets with an order but no limit (mluu)
* Fix rename_table on MSSQL for case sensitive collations and schemas (mluu)
* Add a :single_root option to the tree plugin, for enforcing a single root value via a before_save hook (jfirebaugh)
* Add a Model#root? method to the tree plugin, for checking if the current node is a root (jfirebaugh)
* Add a :raise_on_failure option to Model#save to override the raise_on_save_failure setting (jfirebaugh)
* Handle class discriminator column names that are existing ruby method names in the single table inheritance plugin (jeremyevans)
* Fix times and datetimes when timezone support is used and you are loading a standard time when in daylight time or vice versa (gcampbell)
* Handle literalization of OCI8::CLOB objects in the native oracle adapter (jeremyevans)
* Raise a Sequel::Error instead of an ArgumentError if the migration current or target version does not exist (jeremyevans)
* Fix Database#schema on Oracle when the same table exists in multiple schemas (djwhitt)
* Fix Database#each_server when using a connection string to connect (jeremyevans)
* Make Model dataset's destroy method respect the model's use_transactions setting, instead of always using a transaction (jeremyevans)
* Add Database#adapter_scheme, for checking which adapter a Database uses (jeremyevans)
* Allow Dataset#grep to take :all_patterns, :all_columns, and :case_insensitive options (mighub, jeremyevans)
=== 3.13.0 (2010-07-01)
* Allow Model.find_or_create to take a block which is yielded the object to be created, if no object is found (zaius, jeremyevans)
* Make PlaceholderLiteralString a GenericExpression subclass (jeremyevans)
* Allow nil/NULL to be used as a CASE expression value (jeremyevans)
* Support bitwise operators on more databases (jeremyevans)
* Make PostgreSQL do bitwise xor instead of exponentiation for ^ operator (jeremyevans)
* Fix handling of tinyint(1) columns when connecting to MySQL via JDBC (jeremyevans)
* Handle arrays of two element arrays as filter hash values automatically (jeremyevans)
* Allow :frame option for windows to take a string that is used literally (jeremyevans)
* Support transaction isolation levels on PostgreSQL, MySQL, and MSSQL (jeremyevans)
* Support prepared transactions/two-phase commit on PostgreSQL, MySQL, and H2 (jeremyevans)
* Allow NULLS FIRST/LAST when ordering using the :nulls=>:first/:last option to asc and desc (jeremyevans)
* On PostgreSQL, if no :schema option is provided for #tables, #table_exists?, or #schema, assume all schemas except the default non-public ones (jeremyevans) (#305)
* Cache prepared statements when using the native sqlite driver, improving performance (jeremyevans)
* Add a Tree plugin for treating model objects as being part of a tree (jeremyevans, mwlang)
* Add a :methods_module association option, for choosing the module into which association methods are placed (jeremyevans)
* Add a List plugin for treating model objects as being part of a list (jeremyevans, aemadrid)
* Don't attempt to use class polymorphism in the class_table_inheritance plugin if no cti_key is defined (jeremyevans)
* Add a XmlSerializer plugin for serializing/deserializing model objects to/from XML (jeremyevans)
* Add a JsonSerializer plugin for serializing/deserializing model objects to/from JSON (jeremyevans)
* Handle unsigned integers in the schema dumper (jeremyevans)
=== 3.12.1 (2010-06-09)
* Make :encoding option work on MySQL even if config file specifies different encoding (jeremyevans) (#300)
=== 3.12.0 (2010-06-01)
* Add a :deferrable option to foreign_key for creating deferrable foreign keys (hydrow)
* Add a :join_table_block many_to_many association option used by the add/remove/remove_all methods (jeremyevans)
* Add an AssociationPks plugin that adds association_pks and association_pks= methods for *_to_many associations (jeremyevans)
* Add an UpdatePrimaryKey plugin that allows you to update the primary key of a model object (jeremyevans)
* Add a SkipCreateRefresh plugin that skips the refresh when saving new model objects (jeremyevans)
* Add a StringStripper plugin that strips strings before assigning them to model attributes (jeremyevans)
* Allow the :eager_loader association proc to accept a single hash instead of 3 arguments (jeremyevans)
* Add a Dataset#order_append alias for order_more, for consistency with order_prepend (jeremyevans)
* Add a Dataset#order_prepend method that adds to the end of an existing order (jeremyevans)
* Add a Sequel::NotImplemented exception class, use instead of NotImplementedError (jeremyevans)
* Correctly handle more than 2 hierarchy levels in the single table inheritance plugin (jeremyevans)
* Allow using a custom column value<->class mapping to the single_table_inheritance plugin (jeremyevans, tmm1)
* Handle SQL::Identifiers in the schema_dumper extension (jeremyevans) (#304)
* Make sure certain alter table operations clear the schema correctly on MySQL (jeremyevans) (#301)
* Fix leak of JDBC Statement objects when using transactions on JDBC on databases that support savepoints (jeremyevans)
* Add DatabaseDisconnectError support to the ODBC adapter (Joshua Hansen)
* Make :encoding option work on MySQL in some cases where it was ignored (jeremyevans) (#300)
* Make Model::Errors#on always return nil if there are no errors on that attribute (jeremyevans)
* When using multiple plugins that add before hooks, the order that the hooks are called may have changed (jeremyevans)
* The hook_class_methods plugin no longer skips later after hooks if earlier after hooks return false (jeremyevans)
* Add Model#set_fields and update_fields, similar to set_only and update_only but ignoring other keys in the hash (jeremyevans)
* Add Model.qualified_primary_key_hash, similar to primary_key_hash but with qualified columns (jeremyevans)
* Make Model::Errors#empty? handle attributes with empty error arrays (jeremyevans)
* No longer apply association options to join table dataset when removing all many_to_many associated objects (jeremyevans)
* Log the execution times of migrations to the database's loggers (jeremyevans)
* Add a TimestampMigrator that can work with migrations where versions are timestamps, and handle migrations applied out of order (jeremyevans)
* Completely refactor Sequel::Migrator, now a class instead of a module (jeremyevans)
* Save migration version after each migration, instead of after all migrations (jeremyevans)
* Raise an error if missing a migration version (jeremyevans)
* Raise an error if using a duplicate migration version (jeremyevans)
* Add a Sequel.migration DSL for defining migrations (jeremyevans)
* Add a sharding plugin giving Sequel::Model objects support for dealing with sharding (jeremyevans)
* Handle timestamp(N) with time zone data types (hone)
* Fix MSSQL temporary table creation, but watch out as it changes the table name (gpd, jeremyevans) (#299)
=== 3.11.0 (2010-05-03)
* Allow shared postgresql adapter to work with ruby 1.9 with the -Ku switch (golubev.pavel) (#298)
* Add support for connecting to MSSQL via JTDS in the JDBC adapter (jeremyevans)
* Support returning the number of rows updated/deleted on MSSQL when using the ADO adapter with an explicit :provider (jeremyevans)
* Support transactions in the ADO adapter if not using the default :provider (jeremyevans)
* Make Database#disconnect not raise an exception when using the unsharded single connection pool (jeremyevans)
* Attempt to handle JDBC connection problems in cases where driver auto loading doesn't work (e.g. Tomcat) (elskwid)
* Make native MySQL adapter's tinyint to boolean conversion only convert tinyint(1) columns and not larger tinyint columns (roland.swingler) (#294)
* Fix use of limit with distinct on Microsoft SQL Server (jeremyevans) (#297)
* Correctly swallow errors when using :ignore_index_errors in Database#create_table when using unsupported indexes (jeremyevans) (#295)
* Fix insert returning the autogenerated key when using the 5.1.12 MySQL JDBC driver (viking)
* Consider number/numeric/decimal columns with a 0 scale to be integer columns (e.g. numeric(10, 0)) (jeremyevans, QaDes)
* Fix Database#rename_table on Microsoft SQL Server (rohit.namjoshi) (#293)
* Add Dataset#provides_accurate_rows_matched?, for seeing if update and delete are likely to return correct numbers (jeremyevans)
* Add require_modification to Sequel::Model, for checking that model instance updating and deleting affects a single row (jeremyevans)
* Fix leak of ResultSets when getting metadata in the jdbc adapter (jrun)
* Make Dataset#filter and related methods just clone receiver if given an empty argument, such as {}, [], or '' (jeremyevans)
* Add instance_filters plugin, for adding arbitrary filters when updating/destroying the instance (jeremyevans)
* No longer create the #{plugin}_opts methods for plugins (jeremyevans)
* Support :auto_vacuum, :foreign_keys, :synchronous, and :temp_store Database options on SQLite, for thread-safe PRAGMA setting (jeremyevans)
* Add foreign_keys accessor to SQLite Database objects (enabled by default), which modifies the foreign_keys PRAGMA available in 3.6.19+ (jeremyevans)
* Add an Database#sqlite_version method when connecting to SQLite, used to determine feature support (jeremyevans)
* Fix rolling back transactions when connecting to Oracle via JDBC (jeremyevans)
* Fix syntax errors when connecting to MSSQL via the dbi adapter (jeremyevans) (#292)
* Add support for an :after_connect option when connection, called with each new connection made (jeremyevans)
* Add support for a :test option when connecting to be automatically test the connection (jeremyevans)
* Add Dataset#select_append, which always appends to the existing SELECTed columns (jeremyevans)
* Emulate DISTINCT ON on MySQL using GROUP BY (jeremyevans)
* Make MSSQL shared adapter emulate set_column_null alter table op better with types containing sizes (jeremyevans) (#291)
* Add :config_default_group and :config_local_infile options to the native MySQL adapter (jeremyevans)
* Add log_warn_duration attribute to Database, queries that take longer than it will be logged at warn level (jeremyevans)
* Switch Database logging to use log_yield instead of log_info, queries that raise errors are now logged at error level (jeremyevans)
* Update active_model plugin to work with the ActiveModel::Lint 3.0.0beta2 specs (jeremyevans)
* Support JNDI connection strings in the JDBC adapter (jrun)
=== 3.10.0 (2010-04-02)
* Make one_to_one setter and *_to_many remove_all methods apply the association options (jeremyevans)
* Make nested_attributes plugin handle invalid many_to_one associations better (john_firebaugh)
* Remove private methods from Sequel::BasicObject on ruby 1.8 (i.e. most Kernel methods) (jeremyevans)
* Add Sequel::BasicObject.remove_methods!, useful on 1.8 if libraries required after Sequel add methods to Object (jeremyevans)
* Change Sequel.connect with a block to return the block's value (jonas11235)
* Add an rcte_tree plugin, which uses recursive common table expressions for loading trees stored as adjacency lists (jeremyevans)
* Make typecast_on_load plugin also typecast when refreshing the object (either explicitly or implicitly after creation) (jeremyevans)
* Fix schema parsing and dumping of tinyint columns when connecting to MySQL via the do adapter (ricardochimal)
* Fix transactions when connecting to Oracle via JDBC (jeremyevans)
* Fix plugin loading when plugin module name is the same as an already defined top level constant (jeremyevans)
* Add an AS400 JDBC subadapter (need jt400.jar in classpath) (jeremyevans, bhauff)
* Fix the emulated MSSQL offset support when core extensions are not used (jeremyevans)
* Make Sequel::BasicObject work correctly on Rubinius (kronos)
* Add the :eager_loader_key option to associations, useful for custom eager loaders (jeremyevans)
* Dataset#group_and_count no longer orders by the count (jeremyevans)
* Fix Dataset#limit on MSSQL 2000 (jeremyevans)
* Support eagerly load nested associations when lazily loading *_to_one associations using the :eager option (jeremyevans)
* Fix the one_to_one setter to work with a nil argument (jeremyevans)
* Cache one_to_one associations like many_to_one associations instead of one_to_many associations (jeremyevans)
* Use the singular form for one_to_one association names instead of the plural form (john_firebaugh)
* Add real one_to_one associations, using the :one_to_one option of one_to_many is now an error (jeremyevans)
* Add Model#lock! which uses Dataset#for_update to lock model rows (jeremyevans)
* Add Dataset#for_update as a standard dataset method (jeremyevans)
* Add composition plugin, simlar to ActiveRecord's composed_of (jeremyevans)
* Combine multiple complex expressions for simpler SQL and object tree (jeremyevans)
* Add Dataset#first_source_table, for the unaliased version of the table for the first source (jeremyevans)
* Raise a more explicit error if attempting to use the sqlite adapter with sqlite3 instead of sqlite3-ruby (jeremyevans)
=== 3.9.0 (2010-03-04)
* Allow loading adapters and extensions from outside of the Sequel lib directory (jeremyevans)
* Make limit and offset work as bound variables in prepared statements (jeremyevans)
* In the single_table_inheritance plugin, handle case where the sti_key is nil or '' specially (jeremyevans) (#287)
* Handle IN/NOT IN with an empty array (jeremyevans)
* Emulate IN/NOT IN with multiple columns where the database doesn't support it and a dataset is given (jeremyevans)
* Add Dataset#unused_table_alias, for generating a table alias that has not yet been used in the query (jeremyevans)
* Support an empty database argument in bin/sequel, useful for testing things without a real database (jeremyevans)
* Support for schemas and aliases when eager graphing (jeremyevans)
* Handle using an SQL::Identifier as an 4th option to Dataset#join_table (jeremyevans)
* Move gem spec from Rakefile to a .gemspec file, for compatibility with gem build and builder (jeremyevans) (#285)
* Fix MSSQL 2005+ offset emulation on ruby 1.9 (jeremyevans)
* Make active_model plugin work with ActiveModel 3.0 beta Lint specs, now requires active_model (jeremyevans)
* Correctly create foreign key constraints on MySQL with the InnoDB engine, but you must specify the :key option (jeremyevans)
* Add an optimistic_locking plugin for models, similar to ActiveRecord's optimistic locking support (jeremyevans)
* Handle implicitly qualified symbols in UPDATE statements, useful for updating joined datasets (jeremyevans)
* Have schema_dumper extension pass options hash to Database#tables (jeremyevans) (#283)
* Make all internal uses of require thread-safe (jeremyevans)
* Refactor connection pool into 4 separate pools, increase performance for unsharded setups (jeremyevans)
* Change a couple instance_evaled lambdas into procs, for 1.9.2 compatibility (jeremyevans)
* Raise error message earlier if DISTINCT ON is used on SQLite (jeremyevans)
* Speed up prepared statements on SQLite (jeremyevans)
* Correctly handle ODBC timestamps when database_timezone is nil (jeremyevans)
* Add Sequel::ValidationFailed#errors (tmm1)
=== 3.8.0 (2010-01-04)
* Catch cases in the postgres adapter where exceptions weren't converted or raised appropriately (jeremyevans)
* Don't double escape backslashes in string literals in the mssql shared adapter (john_firebaugh)
* Fix order of ORDER and HAVING clauses in the mssql shared adapter (mluu)
* Add validates_type to the validation_helpers plugin (mluu)
* Attempt to detect database disconnects in the JDBC adapter (john_firebaugh)
* Add Sequel::SQL::Expression#==, so arbtirary expressions can be compared by value (dlee)
* Respect the :size option for the generic File type on MySQL to create tinyblob, mediumblob, and longblob (ibc)
* Don't use the OUTPUT clause on SQL Server versions that don't support it (pre-2005) (jeremyevans) (#281)
* Raise DatabaseConnectionErrors in the single-threaded connection pool if unable to connect (jeremyevans)
* Fix handling of non-existent server in single-threaded connection pool (jeremyevans)
* Default to using mysqlplus driver in the native mysql adapter, fall back to mysql driver (ibc, jeremyevans)
* Handle 64-bit integers in JDBC prepared statements (paulfras)
* Improve blob support when using the H2 JDBC subadapter (nullstyle, jeremyevans, paulfras)
* Add Database#each_server, which yields a new Database object for each server in the connection pool which is connected to only that server (jeremyevans)
* Add Dataset#each_server, which yields a dataset for each server in the connection pool which is will execute on that server (jeremyevans)
* Remove meta_eval and metaclass private methods from Sequel::Metaprogramming (jeremyevans)
* Merge Dataset::FROM_SELF_KEEP_OPTS into Dataset::NON_SQL_OPTIONS (jeremyevans)
* Add Database#remove_servers for removing servers from the pool on the fly (jeremyevans)
* When disconnecting servers, if there are any connections to the server currently in use, schedule them to be disconnected (jeremyevans)
* Allow disconnecting specific server(s)/shard(s) in Database#disconnect via a :servers option (jeremyevans)
* Handle multiple statements in a single query in the native MySQL adapter in all cases, not just when selecting via Dataset#each (jeremyevans)
* In the boolean_readers plugin, don't raise an error if the model's columns can't be determined (jeremyevans)
* In the identity_map plugin, remove instances from the cache if they are deleted/destroyed (jeremyevans)
* Add Database#add_servers, for adding new servers/shards on the fly (chuckremes, jeremyevans)
=== 3.7.0 (2009-12-01)
* Add Dataset#sequence to the shared Oracle Adapter, for returning autogenerated primary key values on insert (jeremyevans) (#280)
* Bring support for modifying joined datasets into Sequel proper, supported on MySQL and PostgreSQL (jeremyevans)
* No longer use native autoreconnection in the mysql adapter (jeremyevans)
* Add NULL, NOTNULL, TRUE, SQLTRUE, FALSE, and SQLFALSE constants (jeremyevans)
* Add Dataset #select_map, #select_order_map, and #select_hash (jeremyevans)
* Make Dataset#group_and_count handle arguments other than Symbols (jeremyevans)
* Add :only_if_modified option to validates_unique method in validation_helpers plugin (jeremyevans)
* Allow specifying the dataset alias via :alias option when using union/intersect/except (jeremyevans)
* Allow Model#destroy to take an options hash and respect a :transaction option (john_firebaugh)
* If a transaction is being used, raise_on_save_failure is false, and a before hook returns false, rollback the transaction (john_firebaugh, jeremyevans)
* In the schema_dumper, explicitly specify the :type option if it isn't Integer (jeremyevans)
* On postgres, use bigserial type if :type=>Bignum is given as an option to primary_key (jeremyevans)
* Use READ_DEFAULT_GROUP in the mysql adapter to load the options in the client section of the my.cnf file (crohr)
=== 3.6.0 (2009-11-02)
* Make the MSSQL shared adapter correctly parse the column schema information for tables in the non-default database schema (rohit.namjoshi)
* Use save_changes instead of save when updating existing associated objects in the nested_attributes plugin (jeremyevans)
* Allow Model#save_changes to accept an option hash that is passed to save, so you can save changes without validating (jeremyevans)
* Make nested_attributes plugin add newly created objects to cached association array immediately (jeremyevans)
* Make add_ association method not add the associated object to the cached array if it's already there (jeremyevans)
* Add Model#modified! for explicitly marking an object as modified, so save_changes/update will run callbacks even if no columns have been modified (jeremyevans)
* Add support for a :fields option in the nested attributes plugin, and only allow updating of the fields specified (jeremyevans)
* Don't allow modifying keys related to the association when updating existing objects in the nested_attributes plugin (jeremyevans)
* Add associated_object_keys method to AssociationReflection objects, specifying the key(s) in the associated model table related to the association (jeremyevans)
* Support the memcached protocol in the caching plugin via the new :ignore_exceptions option (EppO, jeremyevans)
* Don't modify array with a string and placeholders passed to Dataset#filter or related methods (jeremyevans)
* Speed up Amalgalite adapter (copiousfreetime)
* Fix bound variables on PostgreSQL when using nil and potentially other values (jeremyevans)
* Allow easier overriding of default options used in the validation_helpers plugin (jeremyevans)
* Have Dataset#literal_other call sql_literal on the object if it responds to it (heda, michaeldiamond)
* Fix Dataset#explain in the amalgalite adapter (jeremyevans)
* Have Model.table_name respect table aliases (jeremyevans)
* Allow marshalling of saved model records after calling #marshallable! (jeremyevans)
* one_to_many association methods now make sure that the removed object is currently associated to the receiver (jeremyevans)
* Model association add_ and remove_ methods now have more descriptive error messages (jeremyevans)
* Model association add_ and remove_ methods now make sure passed object is of the correct class (jeremyevans)
* Model association remove_ methods now accept a primary key value and disassociate the associated model object (natewiger, jeremyevans)
* Model association add_ methods now accept a hash and create a new associated model object (natewiger, jeremyevans)
* Dataset#window for PostgreSQL datasets now respects previous windows (jeremyevans)
* Dataset#simple_select_all? now ignores options that don't affect the SQL being issued (jeremyevans)
* Account for table aliases in eager_graph (mluu)
* Add support for MSSQL clustered index creation (mluu)
* Implement insert_select in the MSSQL adapter via OUTPUT. Can be disabled via disable_insert_output. (jfirebaugh, mluu)
* Correct error handling when beginning a transaction fails (jfirebaugh, mluu)
* Correct JDBC binding for Time objects in prepared statements (jfirebaugh, jeremyevans)
* Emulate JOIN USING clause poorly using JOIN ON if the database doesn't support JOIN USING (e.g. MSSQL, H2) (jfirebaugh, jeremyevans)
* Support column aliases in Dataset#group_and_count (jfirebaugh)
* Support preparing insert statements of the form insert(1,2,3) and insert(columns, values) (jfirebaugh)
* Fix add_index for tables in non-default schema (jfirebaugh)
* Allow named placeholders in placeholder literal strings (jeremyevans)
* Allow the force_encoding plugin to work when refreshing (jeremyevans)
* Add Dataset#bind for setting bound variable values before calling #call (jeremyevans)
* Add additional join methods to Dataset: (cross|natural|(natural_)?(full|left|right))_join (jeremyevans)
* Fix use a dataset aggregate methods (e.g. sum) on limited/grouped/etc. datasets (jeremyevans)
* Clear changed_columns when saving new model objects with a database adapter that supports insert_select, such as postgres (jeremyevans)
* Fix Dataset#replace with default values on MySQL, and respect insert-related options (jeremyevans)
* Fix Dataset#lock on PostgreSQL (jeremyevans)
* Fix Dataset#explain on SQLite (jeremyevans)
* Add Dataset#use_cursor to the native postgres adapter, for processing large datasets (jeremyevans)
* Don't ignore Class.inherited in Sequel::Model.inherited (antage) (#277)
* Optimize JDBC::MySQL::DatabaseMethods#last_insert_id to prevent additional queries (tmm1)
* Fix use of MSSQL with ruby 1.9 (cult hero)
* Don't try to load associated objects when the current object has NULL for one of the key fields (jeremyevans)
* No longer require GROUP BY to use HAVING, except on SQLite (jeremyevans)
* Add emulated support for the lack of multiple column IN/NOT IN support in MSSQL and SQLite (jeremyevans)
* Add emulated support for #ilike on MSSQL and H2 (jeremyevans)
* Add a :distinct option for all associations, which uses the SQL DISTINCT clause (jeremyevans)
* Don't require :: prefix for constant lookups in instance_evaled virtual row blocks on ruby 1.9 (jeremyevans)
=== 3.5.0 (2009-10-01)
* Correctly literalize timezones in timestamps when using Oracle (jeremyevans)
* Add class_table_inheritance plugin, supporting inheritance in the database using a table-per-model-class approach (jeremyevans)
* Allow easier overriding of model code to insert and update individual records (jeremyevans)
* Allow graphing to work on previously joined datasets, and eager graphing of models backed by joined datasets (jeremyevans)
* Fix MSSQL emulated offset support for datasets with row_procs (e.g. Model datasets) (jeremyevans)
* Support composite keys with set_primary_key when called with an array of multiple symbols (jeremyevans)
* Fix select_more and order_more to not affect receiver (tamas.denes, jeremyevans)
* Support composite keys in model associations, including many_through_many plugin support (jeremyevans)
* Add the force_encoding plugin for forcing encoding of strings for models (requires ruby 1.9) (jeremyevans)
* Support DataObjects 0.10 (previous DataObjects versions are now unsupported) (jeremyevans)
* Allow the user to specify the ADO connection string via the :conn_string option (jeremyevans)
* Add thread_local_timezones extension for allow per-thread overrides of the global timezone settings (jeremyevans)
* Add named_timezones extension for using named timezones such as "America/Los_Angeles" using TZInfo (jeremyevans)
* Pass through unsigned/elements/size and other options when altering columns on MySQL (tmm1)
* Replace Dataset#virtual_row_block_call with Sequel.virtual_row (jeremyevans)
* Allow Dataset #delete, #update, and #insert to respect existing WITH clauses on MSSQL (dlee, jeremyevans)
* Add touch plugin, which adds Model#touch for updating an instance's timestamp, as well as touching associations when an instance is updated or destroyed (jeremyevans)
* Add sql_expr extension, which adds the sql_expr to all objects, giving them easy access to Sequel's DSL (jeremyevans)
* Add active_model plugin, which gives Sequel::Model an ActiveModel compliant API, passes the ActiveModel::Lint tests (jeremyevans)
* Fix MySQL commands out of sync error when using queries with multiple result sets without retrieving all result sets (jeremyevans)
* Allow splitting of multiple result sets into separate arrays when using multiple statements in a single query in the native MySQL adapter (jeremyevans)
* Don't include primary key indexes when parsing MSSQL indexes on JDBC (jeremyevans)
* Make Dataset#insert_select return nil on PostgreSQL if disable_insert_returning is used (jeremyevans)
* Speed up execution of prepared statements with bound variables on MySQL ([email protected])
* Add association_dependencies plugin, for deleting, destroying, or nullifying associated objects when destroying a model object (jeremyevans)
* Add :validate association option, set to false to not validate when implicitly saving associated objects (jeremyevans)
* Add subclasses plugin, for recording all of a models subclasses and descendent classes (jeremyevans)
* Add looser_typecasting extension, for using .to_f and .to_i instead of Kernel.Float and Kernel.Integer when typecasting floats and integers (jeremyevans)
* Catch database errors when preparing statements or setting variable values when using the native MySQL adapter (jeremyevans)
* Add typecast_on_load plugin, for fixing bad database typecasting when loading model objects (jeremyevans)
* Detect more types of MySQL disconnection errors (jeremyevans)
* Add Sequel.convert_exception_class for wrapping exceptions (jeremyevans)
* Model#modified? now always considers new records as modified (jeremyevans)
* Typecast before checking current model attribute value, instead of after (jeremyevans)
* Don't attempt to use unparseable defaults as literals when dumping the schema for a MySQL database (jeremyevans)
* Handle MySQL enum defaults in the schema dumper (jeremyevans)
* Support Database#server_version on MSSQL (dlee, jeremyevans)
* Support updating and deleting joined datasets on MSSQL (jfirebaugh)
* Support the OUTPUT SQL clause on MSSQL delete, insert, and update statements (jfirebaugh)
* Refactor generation of delete, insert, select, and update statements (jfirebaugh, jeremyevans)
* Do a better job of parsing defaults on MSSQL (jfirebaugh)
=== 3.4.0 (2009-09-02)
* Allow datasets without tables to work correctly on Oracle (mikegolod)
* Add #invert, #asc, and #desc to OrderedExpression (dlee)
* Allow validates_unique to take a block used to scope the uniqueness constraint (drfreeze, jeremyevans)
* Automatically save a new many_to_many associated object when associating the object via add_* (jeremyevans)
* Add a nested_attributes plugin for modifying associated objects directly through a model object (jeremyevans)
* Add an instance_hooks plugin for adding hooks to specific model instances (jeremyevans)
* Add a boolean_readers plugin for creating attribute? methods for boolean columns (jeremyevans)
* Add Dataset#ungrouped which removes existing grouping (jeremyevans)
* Make Dataset#group with nil or no arguments to remove existing grouping (dlee)
* Fix using multiple emulated ALTER TABLE statements (e.g. drop_column) in a single alter_table block on SQLite (jeremyevans)
* Don't allow inserting on a grouped dataset or a dataset that selects from multiple tables (jeremyevans)
* Allow class Item < Sequel::Model(DB2) to work (jeremyevans)
* Add Dataset#truncate for truncating tables (jeremyevans)
* Add Database#run method for executing arbitrary SQL on a database (jeremyevans)
* Handle index parsing correctly for tables in a non-default schema on JDBC (jfirebaugh)
* Handle unique index parsing correctly when connecting to MSSQL via JDBC (jfirebaugh)
* Add support for converting Time/DateTime to local or UTC time upon storage, retrieval, or typecasting (jeremyevans)
* Accept a hash when typecasting values to date, time, and datetime types (jeremyevans)
* Make JDBC adapter prepared statements support booleans, blobs, and potentially any type of object (jfirebaugh)
* Refactor the inflection support and modify the default inflections (jeremyevans, dlee)
* Make the serialization and lazy_attribute plugins add accessor methods to modules included in the class (jeremyevans)
* Make Database#schema on JDBC include a :column_size entry specifying the maximum length/precision for the column (jfirebaugh)
* Make Database#schema on JDBC accept a :schema option (dlee)
* Fix Dataset#import when called with a dataset (jeremyevans)
* Give a much more descriptive error message if the mysql.rb driver is detected (jeremyevans)
* Make postgres adapter work with a modified postgres-pr that raises PGError (jeremyevans)
* Make ODBC adapter respect Sequel.datetime_class (jeremyevans)
* Add support for generic concepts of CURRENT_{DATE,TIME,TIMESTAMP} (jeremyevans)
* Add a timestamps plugin for automatically creating hooks for create and update timestamps (jeremyevans)
* Add support for serializing to json (derdewey)
=== 3.3.0 (2009-08-03)
* Add an assocation_proxies plugin that uses proxies for associations (jeremyevans)
* Have the add/remove/remove_all methods take additional arguments and pass them to the internal methods (clivecrous)
* Move convert_tinyint_to_bool method from Sequel to Sequel::MySQL (jeremyevans)
* Model associations now default to associating to classes in the same scope (jeremyevans, nougad) (#274)
* Add Dataset#unlimited, similar to unfiltered and unordered (jeremyevans)
* Make Dataset#from_self take an options hash and respect an :alias option, giving the alias to use (Phrogz)
* Make the JDBC adapter accept a :convert_types option to turn off Java type conversion and double performance (jeremyevans)
* Slight increase in ConnectionPool performance (jeremyevans)
* SQL::WindowFunction can now be aliased/casted etc. just like SQL::Function (jeremyevans)
* Model#save no longer attempts to update primary key columns (jeremyevans)
* Sequel will now unescape values provided in connection strings (e.g. ado:///db?host=server%5cinstance) (jeremyevans)
* Significant improvements to the ODBC and ADO adapters in general (jeremyevans)
* The ADO adapter no longer attempts to use database transactions, since they never worked (jeremyevans)
* Much better support for Microsoft SQL Server using the ADO, ODBC, and JDBC adapters (jeremyevans)
* Support rename_column, set_column_null, set_column_type, and add_foreign_key on H2 (jeremyevans)
* Support adding a column with a primary key or unique constraint to an existing table on SQLite (jeremyevans)
* Support altering a column's type, null status, or default on SQLite (jeremyevans)
* Fix renaming a NOT NULL column without a default on MySQL (nougad, jeremyevans) (#273)
* Don't swallow DatabaseConnectionErrors when creating model subclasses (tommy.midttveit)
=== 3.2.0 (2009-07-02)
* In the STI plugin, don't overwrite the STI field if it is already set (jeremyevans)
* Add support for Common Table Expressions, which use the SQL WITH clause (jeremyevans)
* Add SQL::WindowFunction, expand virtual row blocks to support them and other constructions (jeremyevans)
* Add Model#autoincrementing_primary_key, for when the autoincrementing key isn't the same as the primary key (jeremyevans)