amalgalite 0.5.1-x86-mswin32-60 → 0.6.0-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HISTORY +15 -2
- data/README +3 -0
- data/examples/define_aggregate.rb +75 -0
- data/examples/define_function.rb +104 -0
- data/examples/gems.db +0 -0
- data/ext/amalgalite3.h +28 -2
- data/ext/amalgalite3_blob.c +1 -2
- data/ext/amalgalite3_database.c +567 -46
- data/ext/amalgalite3_requires_bootstrap.c +1 -3
- data/ext/amalgalite3_statement.c +2 -2
- data/ext/extconf.rb +1 -0
- data/ext/sqlite3.c +6521 -4518
- data/ext/sqlite3.h +50 -43
- data/ext/test_error.c +77 -0
- data/lib/amalgalite.rb +5 -0
- data/lib/amalgalite/aggregate.rb +67 -0
- data/lib/amalgalite/busy_timeout.rb +47 -0
- data/lib/amalgalite/column.rb +1 -1
- data/lib/amalgalite/database.rb +271 -2
- data/lib/amalgalite/function.rb +61 -0
- data/lib/amalgalite/progress_handler.rb +21 -0
- data/lib/amalgalite/sqlite3.rb +1 -0
- data/lib/amalgalite/sqlite3/database/function.rb +48 -0
- data/lib/amalgalite/version.rb +2 -2
- data/lib/amalgalite3.so +0 -0
- data/spec/aggregate_spec.rb +168 -0
- data/spec/busy_handler.rb +164 -0
- data/spec/database_spec.rb +97 -3
- data/spec/function_spec.rb +86 -0
- data/spec/progress_handler_spec.rb +103 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/sqlite3/version_spec.rb +2 -2
- metadata +21 -3
data/ext/sqlite3.h
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
** the version number) and changes its name to "sqlite3.h" as
|
31
31
|
** part of the build process.
|
32
32
|
**
|
33
|
-
** @(#) $Id: sqlite.h.in,v 1.
|
33
|
+
** @(#) $Id: sqlite.h.in,v 1.420 2008/12/16 13:46:30 drh Exp $
|
34
34
|
*/
|
35
35
|
#ifndef _SQLITE3_H_
|
36
36
|
#define _SQLITE3_H_
|
@@ -107,8 +107,8 @@ extern "C" {
|
|
107
107
|
** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z
|
108
108
|
** are the major version, minor version, and release number.
|
109
109
|
*/
|
110
|
-
#define SQLITE_VERSION "3.6.
|
111
|
-
#define SQLITE_VERSION_NUMBER
|
110
|
+
#define SQLITE_VERSION "3.6.7"
|
111
|
+
#define SQLITE_VERSION_NUMBER 3006007
|
112
112
|
|
113
113
|
/*
|
114
114
|
** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
|
@@ -507,6 +507,8 @@ int sqlite3_exec(
|
|
507
507
|
#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
|
508
508
|
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
|
509
509
|
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
|
510
|
+
#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
|
511
|
+
#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
|
510
512
|
|
511
513
|
/*
|
512
514
|
** CAPI3REF: Flags For File Open Operations {H10230} <H11120> <H12700>
|
@@ -723,6 +725,9 @@ struct sqlite3_io_methods {
|
|
723
725
|
** is defined.
|
724
726
|
*/
|
725
727
|
#define SQLITE_FCNTL_LOCKSTATE 1
|
728
|
+
#define SQLITE_GET_LOCKPROXYFILE 2
|
729
|
+
#define SQLITE_SET_LOCKPROXYFILE 3
|
730
|
+
#define SQLITE_LAST_ERRNO 4
|
726
731
|
|
727
732
|
/*
|
728
733
|
** CAPI3REF: Mutex Handle {H17110} <S20130>
|
@@ -770,11 +775,11 @@ typedef struct sqlite3_mutex sqlite3_mutex;
|
|
770
775
|
** The zName field holds the name of the VFS module. The name must
|
771
776
|
** be unique across all VFS modules.
|
772
777
|
**
|
773
|
-
**
|
778
|
+
** SQLite will guarantee that the zFilename parameter to xOpen
|
774
779
|
** is either a NULL pointer or string obtained
|
775
780
|
** from xFullPathname(). SQLite further guarantees that
|
776
781
|
** the string will be valid and unchanged until xClose() is
|
777
|
-
** called.
|
782
|
+
** called. Because of the previous sentense,
|
778
783
|
** the [sqlite3_file] can safely store a pointer to the
|
779
784
|
** filename if it needs to remember the filename for some reason.
|
780
785
|
** If the zFilename parameter is xOpen is a NULL pointer then xOpen
|
@@ -782,14 +787,14 @@ typedef struct sqlite3_mutex sqlite3_mutex;
|
|
782
787
|
** xFilename parameter is NULL it will also be the case that the
|
783
788
|
** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE].
|
784
789
|
**
|
785
|
-
**
|
790
|
+
** The flags argument to xOpen() includes all bits set in
|
786
791
|
** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()]
|
787
792
|
** or [sqlite3_open16()] is used, then flags includes at least
|
788
|
-
** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE].
|
793
|
+
** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE].
|
789
794
|
** If xOpen() opens a file read-only then it sets *pOutFlags to
|
790
795
|
** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set.
|
791
796
|
**
|
792
|
-
**
|
797
|
+
** SQLite will also add one of the following flags to the xOpen()
|
793
798
|
** call, depending on the object being opened:
|
794
799
|
**
|
795
800
|
** <ul>
|
@@ -800,7 +805,7 @@ typedef struct sqlite3_mutex sqlite3_mutex;
|
|
800
805
|
** <li> [SQLITE_OPEN_TRANSIENT_DB]
|
801
806
|
** <li> [SQLITE_OPEN_SUBJOURNAL]
|
802
807
|
** <li> [SQLITE_OPEN_MASTER_JOURNAL]
|
803
|
-
** </ul>
|
808
|
+
** </ul>
|
804
809
|
**
|
805
810
|
** The file I/O implementation can use the object type flags to
|
806
811
|
** change the way it deals with files. For example, an application
|
@@ -818,28 +823,28 @@ typedef struct sqlite3_mutex sqlite3_mutex;
|
|
818
823
|
** <li> [SQLITE_OPEN_EXCLUSIVE]
|
819
824
|
** </ul>
|
820
825
|
**
|
821
|
-
**
|
822
|
-
** deleted when it is closed.
|
826
|
+
** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
|
827
|
+
** deleted when it is closed. The [SQLITE_OPEN_DELETEONCLOSE]
|
823
828
|
** will be set for TEMP databases, journals and for subjournals.
|
824
829
|
**
|
825
|
-
**
|
830
|
+
** The [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened
|
826
831
|
** for exclusive access. This flag is set for all files except
|
827
832
|
** for the main database file.
|
828
833
|
**
|
829
|
-
**
|
834
|
+
** At least szOsFile bytes of memory are allocated by SQLite
|
830
835
|
** to hold the [sqlite3_file] structure passed as the third
|
831
|
-
** argument to xOpen.
|
836
|
+
** argument to xOpen. The xOpen method does not have to
|
832
837
|
** allocate the structure; it should just fill it in.
|
833
838
|
**
|
834
|
-
**
|
839
|
+
** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
|
835
840
|
** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to
|
836
841
|
** test whether a file is readable and writable, or [SQLITE_ACCESS_READ]
|
837
|
-
** to test whether a file is at least readable.
|
842
|
+
** to test whether a file is at least readable. The file can be a
|
838
843
|
** directory.
|
839
844
|
**
|
840
|
-
**
|
841
|
-
** output buffer xFullPathname.
|
842
|
-
** is also passed as a parameter to both methods.
|
845
|
+
** SQLite will always allocate at least mxPathname+1 bytes for the
|
846
|
+
** output buffer xFullPathname. The exact size of the output buffer
|
847
|
+
** is also passed as a parameter to both methods. If the output buffer
|
843
848
|
** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is
|
844
849
|
** handled as a fatal error by SQLite, vfs implementations should endeavor
|
845
850
|
** to prevent this by setting mxPathname to a sufficiently large value.
|
@@ -853,6 +858,7 @@ typedef struct sqlite3_mutex sqlite3_mutex;
|
|
853
858
|
** The xSleep() method causes the calling thread to sleep for at
|
854
859
|
** least the number of microseconds given. The xCurrentTime()
|
855
860
|
** method returns a Julian Day Number for the current date and time.
|
861
|
+
**
|
856
862
|
*/
|
857
863
|
typedef struct sqlite3_vfs sqlite3_vfs;
|
858
864
|
struct sqlite3_vfs {
|
@@ -869,7 +875,7 @@ struct sqlite3_vfs {
|
|
869
875
|
int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);
|
870
876
|
void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
|
871
877
|
void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
|
872
|
-
void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol);
|
878
|
+
void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
|
873
879
|
void (*xDlClose)(sqlite3_vfs*, void*);
|
874
880
|
int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
|
875
881
|
int (*xSleep)(sqlite3_vfs*, int microseconds);
|
@@ -882,14 +888,14 @@ struct sqlite3_vfs {
|
|
882
888
|
/*
|
883
889
|
** CAPI3REF: Flags for the xAccess VFS method {H11190} <H11140>
|
884
890
|
**
|
885
|
-
**
|
891
|
+
** These integer constants can be used as the third parameter to
|
886
892
|
** the xAccess method of an [sqlite3_vfs] object. {END} They determine
|
887
893
|
** what kind of permissions the xAccess method is looking for.
|
888
|
-
**
|
894
|
+
** With SQLITE_ACCESS_EXISTS, the xAccess method
|
889
895
|
** simply checks whether the file exists.
|
890
|
-
**
|
896
|
+
** With SQLITE_ACCESS_READWRITE, the xAccess method
|
891
897
|
** checks whether the file is both readable and writable.
|
892
|
-
**
|
898
|
+
** With SQLITE_ACCESS_READ, the xAccess method
|
893
899
|
** checks whether the file is readable.
|
894
900
|
*/
|
895
901
|
#define SQLITE_ACCESS_EXISTS 0
|
@@ -1044,7 +1050,7 @@ int sqlite3_os_end(void);
|
|
1044
1050
|
** S is a pointer to an aligned memory buffer not less than
|
1045
1051
|
** Z*N bytes in size shall cause S to be used by the
|
1046
1052
|
** [scratch memory allocator] for as many as N simulataneous
|
1047
|
-
** allocations each of size Z.
|
1053
|
+
** allocations each of size (Z & ~7).
|
1048
1054
|
**
|
1049
1055
|
** {H14153} A successful call to [sqlite3_config]([SQLITE_CONFIG_SCRATCH],S,Z,N)
|
1050
1056
|
** where S is a NULL pointer shall disable the
|
@@ -1056,7 +1062,7 @@ int sqlite3_os_end(void);
|
|
1056
1062
|
** S is a pointer to an aligned memory buffer not less than
|
1057
1063
|
** Z*N bytes in size shall cause S to be used by the
|
1058
1064
|
** [pagecache memory allocator] for as many as N simulataneous
|
1059
|
-
** allocations each of size Z.
|
1065
|
+
** allocations each of size (Z & ~7).
|
1060
1066
|
**
|
1061
1067
|
** {H14159} A successful call to
|
1062
1068
|
** [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],S,Z,N)
|
@@ -1404,18 +1410,18 @@ int sqlite3_extended_result_codes(sqlite3*, int onoff);
|
|
1404
1410
|
** CAPI3REF: Last Insert Rowid {H12220} <S10700>
|
1405
1411
|
**
|
1406
1412
|
** Each entry in an SQLite table has a unique 64-bit signed
|
1407
|
-
** integer key called the "rowid". The rowid is always available
|
1413
|
+
** integer key called the [ROWID | "rowid"]. The rowid is always available
|
1408
1414
|
** as an undeclared column named ROWID, OID, or _ROWID_ as long as those
|
1409
1415
|
** names are not also used by explicitly declared columns. If
|
1410
|
-
** the table has a column of type INTEGER PRIMARY KEY then that column
|
1416
|
+
** the table has a column of type [INTEGER PRIMARY KEY] then that column
|
1411
1417
|
** is another alias for the rowid.
|
1412
1418
|
**
|
1413
|
-
** This routine returns the rowid of the most recent
|
1419
|
+
** This routine returns the [rowid] of the most recent
|
1414
1420
|
** successful [INSERT] into the database from the [database connection]
|
1415
1421
|
** in the first argument. If no successful [INSERT]s
|
1416
1422
|
** have ever occurred on that database connection, zero is returned.
|
1417
1423
|
**
|
1418
|
-
** If an [INSERT] occurs within a trigger, then the rowid of the inserted
|
1424
|
+
** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted
|
1419
1425
|
** row is returned by this routine as long as the trigger is running.
|
1420
1426
|
** But once the trigger terminates, the value returned by this routine
|
1421
1427
|
** reverts to the last value inserted before the trigger fired.
|
@@ -1435,7 +1441,8 @@ int sqlite3_extended_result_codes(sqlite3*, int onoff);
|
|
1435
1441
|
**
|
1436
1442
|
** INVARIANTS:
|
1437
1443
|
**
|
1438
|
-
** {H12221} The [sqlite3_last_insert_rowid()] function shall return
|
1444
|
+
** {H12221} The [sqlite3_last_insert_rowid()] function shall return
|
1445
|
+
** the [rowid]
|
1439
1446
|
** of the most recent successful [INSERT] performed on the same
|
1440
1447
|
** [database connection] and within the same or higher level
|
1441
1448
|
** trigger context, or zero if there have been no qualifying
|
@@ -1449,10 +1456,10 @@ int sqlite3_extended_result_codes(sqlite3*, int onoff);
|
|
1449
1456
|
**
|
1450
1457
|
** {A12232} If a separate thread performs a new [INSERT] on the same
|
1451
1458
|
** database connection while the [sqlite3_last_insert_rowid()]
|
1452
|
-
** function is running and thus changes the last insert rowid,
|
1459
|
+
** function is running and thus changes the last insert [rowid],
|
1453
1460
|
** then the value returned by [sqlite3_last_insert_rowid()] is
|
1454
1461
|
** unpredictable and might not equal either the old or the new
|
1455
|
-
** last insert rowid.
|
1462
|
+
** last insert [rowid].
|
1456
1463
|
*/
|
1457
1464
|
sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
|
1458
1465
|
|
@@ -2163,8 +2170,8 @@ sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
|
|
2163
2170
|
** CAPI3REF: Pseudo-Random Number Generator {H17390} <S20000>
|
2164
2171
|
**
|
2165
2172
|
** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
|
2166
|
-
** select random ROWIDs when inserting new records into a table that
|
2167
|
-
** already uses the largest possible ROWID. The PRNG is also used for
|
2173
|
+
** select random [ROWID | ROWIDs] when inserting new records into a table that
|
2174
|
+
** already uses the largest possible [ROWID]. The PRNG is also used for
|
2168
2175
|
** the build-in random() and randomblob() SQL functions. This interface allows
|
2169
2176
|
** applications to access the same PRNG for other purposes.
|
2170
2177
|
**
|
@@ -5113,8 +5120,8 @@ void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
|
|
5113
5120
|
** to be invoked.
|
5114
5121
|
** The third and fourth arguments to the callback contain pointers to the
|
5115
5122
|
** database and table name containing the affected row.
|
5116
|
-
** The final callback parameter is the rowid of the row.
|
5117
|
-
** an update, this is the rowid after the update takes place.
|
5123
|
+
** The final callback parameter is the [rowid] of the row.
|
5124
|
+
** In the case of an update, this is the [rowid] after the update takes place.
|
5118
5125
|
**
|
5119
5126
|
** The update hook is not invoked when internal system tables are
|
5120
5127
|
** modified (i.e. sqlite_master and sqlite_sequence).
|
@@ -5157,7 +5164,7 @@ void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
|
|
5157
5164
|
** to zero-terminated UTF-8 strings which are the names of the
|
5158
5165
|
** database and table that is being updated.
|
5159
5166
|
|
5160
|
-
** {H12985} The final callback parameter is the rowid of the row after
|
5167
|
+
** {H12985} The final callback parameter is the [rowid] of the row after
|
5161
5168
|
** the change occurs.
|
5162
5169
|
*/
|
5163
5170
|
void *sqlite3_update_hook(
|
@@ -5323,7 +5330,7 @@ void sqlite3_soft_heap_limit(int);
|
|
5323
5330
|
** <tr><td> 6th <td> const char* <td> Name of default collation sequence
|
5324
5331
|
** <tr><td> 7th <td> int <td> True if column has a NOT NULL constraint
|
5325
5332
|
** <tr><td> 8th <td> int <td> True if column is part of the PRIMARY KEY
|
5326
|
-
** <tr><td> 9th <td> int <td> True if column is AUTOINCREMENT
|
5333
|
+
** <tr><td> 9th <td> int <td> True if column is [AUTOINCREMENT]
|
5327
5334
|
** </table>
|
5328
5335
|
** </blockquote>
|
5329
5336
|
**
|
@@ -5334,9 +5341,9 @@ void sqlite3_soft_heap_limit(int);
|
|
5334
5341
|
** If the specified table is actually a view, an [error code] is returned.
|
5335
5342
|
**
|
5336
5343
|
** If the specified column is "rowid", "oid" or "_rowid_" and an
|
5337
|
-
** INTEGER PRIMARY KEY column has been explicitly declared, then the output
|
5344
|
+
** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output
|
5338
5345
|
** parameters are set for the explicitly declared column. If there is no
|
5339
|
-
** explicitly declared INTEGER PRIMARY KEY column, then the output
|
5346
|
+
** explicitly declared [INTEGER PRIMARY KEY] column, then the output
|
5340
5347
|
** parameters are set as follows:
|
5341
5348
|
**
|
5342
5349
|
** <pre>
|
@@ -5443,7 +5450,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
|
|
5443
5450
|
**
|
5444
5451
|
** {H12644} Automatic extensions apply across all threads.
|
5445
5452
|
*/
|
5446
|
-
int sqlite3_auto_extension(void *xEntryPoint);
|
5453
|
+
int sqlite3_auto_extension(void (*xEntryPoint)(void));
|
5447
5454
|
|
5448
5455
|
/*
|
5449
5456
|
** CAPI3REF: Reset Automatic Extension Loading {H12660} <S20500>
|
@@ -5760,7 +5767,7 @@ typedef struct sqlite3_blob sqlite3_blob;
|
|
5760
5767
|
** in other words, the same BLOB that would be selected by:
|
5761
5768
|
**
|
5762
5769
|
** <pre>
|
5763
|
-
** SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
|
5770
|
+
** SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
|
5764
5771
|
** </pre> {END}
|
5765
5772
|
**
|
5766
5773
|
** If the flags parameter is non-zero, the the BLOB is opened for read
|
data/ext/test_error.c
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include "sqlite3.h"
|
4
|
+
/**
|
5
|
+
* gcc -o test_error test_error.c sqlite3.c
|
6
|
+
* ./test_error
|
7
|
+
*/
|
8
|
+
|
9
|
+
int callback( void *unused, int argc, char **argv, char **col_name )
|
10
|
+
{
|
11
|
+
return 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
void test_error( sqlite3_context* context, int argc, sqlite3_value **argv)
|
15
|
+
{
|
16
|
+
char* msg = (char*)sqlite3_value_text( argv[0] );
|
17
|
+
int code = sqlite3_value_int( argv[1] );
|
18
|
+
|
19
|
+
fprintf( stderr, "Writting error msg '%s' and error_code %d to context\n", msg, code );
|
20
|
+
|
21
|
+
sqlite3_result_error( context, msg, -1 );
|
22
|
+
sqlite3_result_error_code( context, code);
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
|
26
|
+
int main( int argc, char **argv )
|
27
|
+
{
|
28
|
+
sqlite3 *db;
|
29
|
+
sqlite3_stmt *stmt;
|
30
|
+
const char *tail;
|
31
|
+
char *errmsg;
|
32
|
+
int rc;
|
33
|
+
|
34
|
+
printf("SQLite Version: %s\n", sqlite3_libversion() );
|
35
|
+
|
36
|
+
rc = sqlite3_open_v2( ":memory:", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
|
37
|
+
if ( SQLITE_OK != rc ) {
|
38
|
+
fprintf(stderr, "Failure opening database: %s\n", sqlite3_errmsg( db ) );
|
39
|
+
sqlite3_close( db );
|
40
|
+
exit( 1 );
|
41
|
+
}
|
42
|
+
|
43
|
+
rc = sqlite3_create_function( db, "test_error", 2, SQLITE_UTF8, NULL, test_error, NULL, NULL );
|
44
|
+
if ( SQLITE_OK != rc ) {
|
45
|
+
fprintf( stderr, "Failure creating function: %s\n", sqlite3_errmsg( db ) );
|
46
|
+
sqlite3_close( db );
|
47
|
+
exit( 1 );
|
48
|
+
}
|
49
|
+
|
50
|
+
rc = sqlite3_prepare_v2( db, "SELECT test_error('This is an error', 42)", -1, &stmt, &tail );
|
51
|
+
if ( SQLITE_OK != rc ) {
|
52
|
+
fprintf( stderr, "Failure preparing statement: %s\n", sqlite3_errmsg( db ) );
|
53
|
+
sqlite3_close( db );
|
54
|
+
exit( 1 );
|
55
|
+
}
|
56
|
+
|
57
|
+
rc = sqlite3_create_function( db, "test_error", 2, SQLITE_UTF8, NULL, NULL, NULL, NULL );
|
58
|
+
printf( "remove rc = %d\n", rc );
|
59
|
+
rc = sqlite3_create_function( db, "test_blah", -1, SQLITE_UTF8, NULL, NULL, NULL, NULL );
|
60
|
+
printf( "remove rc 2 = %d\n", rc );
|
61
|
+
|
62
|
+
|
63
|
+
rc = sqlite3_step( stmt );
|
64
|
+
if ( SQLITE_ROW != rc ) {
|
65
|
+
printf( "Return code from sqlite3_step : %d\n", rc );
|
66
|
+
printf( "Before finalizing error code is : %d\n", sqlite3_errcode( db ));
|
67
|
+
printf( "Before finalizing error message is : %s\n", sqlite3_errmsg( db ));
|
68
|
+
}
|
69
|
+
|
70
|
+
rc = sqlite3_reset( stmt );
|
71
|
+
printf( "Return value from sqlite3_finalize : %d\n", rc );
|
72
|
+
printf( "After finalizing errcode is : %d\n", sqlite3_errcode( db ));
|
73
|
+
printf( "After finalizing error message is : %s\n", sqlite3_errmsg( db ));
|
74
|
+
sqlite3_close( db );
|
75
|
+
return 0;
|
76
|
+
|
77
|
+
}
|
data/lib/amalgalite.rb
CHANGED
@@ -15,13 +15,18 @@ module Amalgalite
|
|
15
15
|
#
|
16
16
|
class Error < ::StandardError; end
|
17
17
|
end
|
18
|
+
|
19
|
+
require 'amalgalite/aggregate'
|
18
20
|
require 'amalgalite/blob'
|
19
21
|
require 'amalgalite/boolean'
|
22
|
+
require 'amalgalite/busy_timeout'
|
20
23
|
require 'amalgalite/column'
|
21
24
|
require 'amalgalite/database'
|
25
|
+
require 'amalgalite/function'
|
22
26
|
require 'amalgalite/index'
|
23
27
|
require 'amalgalite/paths'
|
24
28
|
require 'amalgalite/profile_tap'
|
29
|
+
require 'amalgalite/progress_handler'
|
25
30
|
require 'amalgalite/schema'
|
26
31
|
require 'amalgalite/sqlite3'
|
27
32
|
require 'amalgalite/statement'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'amalgalite/sqlite3/database/function'
|
2
|
+
module Amalgalite
|
3
|
+
#
|
4
|
+
# A Base class to inherit from for creating your own SQL aggregate functions
|
5
|
+
# in ruby.
|
6
|
+
#
|
7
|
+
# These are SQL functions similar to _max(X)_, _count(X)_, _avg(X)_. The built
|
8
|
+
# in SQLite aggregate functions are:
|
9
|
+
#
|
10
|
+
# * http://www.sqlite.org/lang_aggfunc.html
|
11
|
+
#
|
12
|
+
# If you choose to use Aggregate as a parent class of your SQL scalar function
|
13
|
+
# implementation you must:
|
14
|
+
#
|
15
|
+
# * implement _initalize()_ with 0 arguments
|
16
|
+
# * set the @arity data member
|
17
|
+
# * set the @name data member
|
18
|
+
# * implement _step_ with arity of +@arity+
|
19
|
+
# * implement _finalize_ with arity of 0
|
20
|
+
#
|
21
|
+
# For instance to implement a _unique_word_count(X)_ aggregate function you could
|
22
|
+
# implement it as:
|
23
|
+
#
|
24
|
+
# class UniqueWordCount < ::Amalgalite::Aggregate
|
25
|
+
# attr_accessor :words
|
26
|
+
#
|
27
|
+
# def initialize
|
28
|
+
# @name = 'unique_word_count'
|
29
|
+
# @arity = 1
|
30
|
+
# @words = Hash.new { |h,k| h[k] = 0 }
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# def step( str )
|
34
|
+
# str.split(/\W+/).each do |word|
|
35
|
+
# words[ word.downcase ] += 1
|
36
|
+
# end
|
37
|
+
# return nil
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# def finalize
|
41
|
+
# return words.size
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
#
|
46
|
+
class Aggregate
|
47
|
+
# The name of the SQL function
|
48
|
+
attr_accessor :name
|
49
|
+
|
50
|
+
# The arity of the SQL function
|
51
|
+
attr_accessor :arity
|
52
|
+
|
53
|
+
# finalize should return the final value of the aggregate function
|
54
|
+
def finalize
|
55
|
+
raise NotImplementedError, "Aggregate#finalize must be implemented"
|
56
|
+
end
|
57
|
+
|
58
|
+
# <b>Do Not Override</b>
|
59
|
+
#
|
60
|
+
# The function signature for use by the Amaglaite datase in tracking
|
61
|
+
# function creation.
|
62
|
+
#
|
63
|
+
def signature
|
64
|
+
@signature ||= ::Amalgalite::SQLite3::Database::Function.signature( self.name, self.arity )
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Amalgalite
|
2
|
+
##
|
3
|
+
# A base class for use in creating your own busy handler classes
|
4
|
+
#
|
5
|
+
class BusyHandler
|
6
|
+
def to_proc
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
# the arity of the call method
|
11
|
+
def arity() 1 ; end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Override this method, returning +false+ if the SQLite should return
|
15
|
+
# SQLITE_BUSY for all parties involved in the lock, and anything else if the
|
16
|
+
# lock attempt should be tried again.
|
17
|
+
def call( count )
|
18
|
+
raise NotImplementedError, "The busy handler call(N) method must be implemented"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# A busy time out class for use in Database#define_busy_handler
|
24
|
+
#
|
25
|
+
class BusyTimeout < BusyHandler
|
26
|
+
attr_reader :call_count
|
27
|
+
##
|
28
|
+
# intialize by setting _count_ and _duration_ ( in milliseconds ).
|
29
|
+
#
|
30
|
+
def initialize( count = 20 , duration = 50 )
|
31
|
+
@count = count
|
32
|
+
@duration = duration.to_f / 1_000
|
33
|
+
@call_count = 0
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# return +false+ if _callcount_ is > _count_ otherwise sleep for _duration_
|
38
|
+
# milliseconds and then return +true+
|
39
|
+
#
|
40
|
+
def call( call_count )
|
41
|
+
@call_count = call_count
|
42
|
+
return false if ( call_count > @count )
|
43
|
+
sleep @duration
|
44
|
+
return true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|