@@ -250,7 +250,6 @@ exports['test all() parameter binding'] = function(beforeExit) {
250250 } ) ;
251251} ;
252252
253-
254253exports [ 'test all() without results' ] = function ( beforeExit ) {
255254 var db = new sqlite3 . Database ( 'test/support/prepare.db' , sqlite3 . OPEN_READONLY ) ;
256255
@@ -267,3 +266,136 @@ exports['test all() without results'] = function(beforeExit) {
267266 assert . ok ( empty , "Didn't retrieve an empty result set" ) ;
268267 } ) ;
269268} ;
269+
270+ exports [ 'test high concurrency' ] = function ( beforeExit ) {
271+ var db = new sqlite3 . Database ( ':memory:' ) ;
272+
273+ function randomString ( ) {
274+ var str = '' ;
275+ for ( var i = Math . random ( ) * 300 ; i > 0 ; i -- ) {
276+ str += String . fromCharCode ( Math . floor ( Math . random ( ) * 256 ) ) ;
277+ }
278+ return str ;
279+ } ;
280+
281+ // Generate random data.
282+ var data = [ ] ;
283+ var length = Math . floor ( Math . random ( ) * 1000 ) + 200 ;
284+ for ( var i = 0 ; i < length ; i ++ ) {
285+ data . push ( [ randomString ( ) , i , i * Math . random ( ) , null ] ) ;
286+ }
287+
288+ var inserted = false ;
289+ var retrieved = 0 ;
290+
291+ Step (
292+ function ( ) {
293+ db . prepare ( "CREATE TABLE foo (txt text, num int, flt float, blb blob)" ) . run ( this ) ;
294+ } ,
295+ function ( err ) {
296+ if ( err ) throw err ;
297+ var group = this . group ( ) ;
298+ for ( var i = 0 ; i < data . length ; i ++ ) {
299+ var stmt = db . prepare ( "INSERT INTO foo VALUES(?, ?, ?, ?)" ) ;
300+ stmt . run ( data [ i ] [ 0 ] , data [ i ] [ 1 ] , data [ i ] [ 2 ] , data [ i ] [ 3 ] , group ( ) ) ;
301+ }
302+ } ,
303+ function ( err , result ) {
304+ if ( err ) throw err ;
305+ assert . ok ( result . length === length , 'Invalid length' ) ;
306+ inserted = true ;
307+
308+ db . prepare ( "SELECT txt, num, flt, blb FROM foo" )
309+ . all ( function ( err , rows ) {
310+ if ( err ) throw err ;
311+
312+ for ( var i = 0 ; i < rows . length ; i ++ ) {
313+ assert . ok ( data [ rows [ i ] [ 1 ] ] !== true ) ;
314+
315+ assert . equal ( rows [ i ] [ 0 ] , data [ rows [ i ] [ 1 ] ] [ 0 ] ) ;
316+ assert . equal ( rows [ i ] [ 1 ] , data [ rows [ i ] [ 1 ] ] [ 1 ] ) ;
317+ assert . equal ( rows [ i ] [ 2 ] , data [ rows [ i ] [ 1 ] ] [ 2 ] ) ;
318+ assert . equal ( rows [ i ] [ 3 ] , data [ rows [ i ] [ 1 ] ] [ 3 ] ) ;
319+
320+ // Mark the data row as already retrieved.
321+ data [ rows [ i ] [ 1 ] ] = true ;
322+ retrieved ++ ;
323+ }
324+ } ) ;
325+ }
326+ ) ;
327+
328+ beforeExit ( function ( ) {
329+ assert . ok ( inserted ) ;
330+ } ) ;
331+ } ;
332+
333+ exports [ 'test Database#get()' ] = function ( beforeExit ) {
334+ var db = new sqlite3 . Database ( 'test/support/prepare.db' , sqlite3 . OPEN_READONLY ) ;
335+
336+ var retrieved = 0 ;
337+
338+ db . get ( "SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?" , 10 , 'String 10' , function ( err , row ) {
339+ if ( err ) throw err ;
340+ assert . equal ( row [ 0 ] , 'String 10' ) ;
341+ assert . equal ( row [ 1 ] , 10 ) ;
342+ assert . equal ( row [ 2 ] , 10 * Math . PI ) ;
343+ assert . equal ( row [ 3 ] , null ) ;
344+ retrieved ++ ;
345+ } ) ;
346+
347+ beforeExit ( function ( ) {
348+ assert . equal ( 1 , retrieved , "Didn't retrieve all rows" ) ;
349+ } ) ;
350+ } ;
351+
352+ exports [ 'test Database#run() and Database#all()' ] = function ( beforeExit ) {
353+ var db = new sqlite3 . Database ( ':memory:' ) ;
354+
355+ var inserted = 0 ;
356+ var retrieved = 0 ;
357+
358+ // We insert and retrieve that many rows.
359+ var count = 1000 ;
360+
361+ Step (
362+ function ( ) {
363+ db . run ( "CREATE TABLE foo (txt text, num int, flt float, blb blob)" , this ) ;
364+ } ,
365+ function ( err ) {
366+ if ( err ) throw err ;
367+ var group = this . group ( ) ;
368+ for ( var i = 0 ; i < count ; i ++ ) {
369+ db . run ( "INSERT INTO foo VALUES(?, ?, ?, ?)" ,
370+ 'String ' + i ,
371+ i ,
372+ i * Math . PI ,
373+ // null (SQLite sets this implicitly)
374+ group ( )
375+ ) ;
376+ }
377+ } ,
378+ function ( err , rows ) {
379+ if ( err ) throw err ;
380+ inserted += rows . length ;
381+ db . all ( "SELECT txt, num, flt, blb FROM foo ORDER BY num" , this )
382+ } ,
383+ function ( err , rows ) {
384+ if ( err ) throw err ;
385+ assert . equal ( count , rows . length , "Couldn't retrieve all rows" ) ;
386+
387+ for ( var i = 0 ; i < count ; i ++ ) {
388+ assert . equal ( rows [ i ] [ 0 ] , 'String ' + i ) ;
389+ assert . equal ( rows [ i ] [ 1 ] , i ) ;
390+ assert . equal ( rows [ i ] [ 2 ] , i * Math . PI ) ;
391+ assert . equal ( rows [ i ] [ 3 ] , null ) ;
392+ retrieved ++ ;
393+ }
394+ }
395+ ) ;
396+
397+ beforeExit ( function ( ) {
398+ assert . equal ( count , inserted , "Didn't insert all rows" ) ;
399+ assert . equal ( count , retrieved , "Didn't retrieve all rows" ) ;
400+ } ) ;
401+ } ;
0 commit comments