amalgalite 0.5.1-x86-mswin32-60 → 0.6.0-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- 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
|