@@ -244,16 +244,28 @@ do_open(ErlNifEnv *env, esqlite_connection *db, const ERL_NIF_TERM arg)
244244{
245245 char filename [MAX_PATHNAME ];
246246 unsigned int size ;
247- int rc ;
247+ int rc , count_args , flag_number ;
248248 ERL_NIF_TERM error ;
249+ const ERL_NIF_TERM * args ;
250+
251+ /*
252+ unpack the arg, the first argument is the filename, the second is the flag count
253+ */
254+ if (!enif_get_tuple (env , arg , & count_args , & args ))
255+ return make_error_tuple (env , "wrong_unpack_of_args_from_open" );
256+ if (count_args != 2 )
257+ return make_error_tuple (env , "wrong_number_of_args_from_open" );
249258
250- size = enif_get_string (env , arg , filename , MAX_PATHNAME , ERL_NIF_LATIN1 );
259+ size = enif_get_string (env , args [ 0 ] , filename , MAX_PATHNAME , ERL_NIF_LATIN1 );
251260 if (size <= 0 )
252261 return make_error_tuple (env , "invalid_filename" );
253262
263+ if (!enif_get_int (env , args [1 ], & flag_number ))
264+ return make_error_tuple (env , "unable_to_get_flag_number_from_open" );
265+
254266 /* Open the database.
255267 */
256- rc = sqlite3_open (filename , & db -> db );
268+ rc = sqlite3_open_v2 (filename , & db -> db , flag_number , NULL );
257269 if (rc != SQLITE_OK ) {
258270 error = make_sqlite3_error_tuple (env , rc , db -> db );
259271 sqlite3_close_v2 (db -> db );
@@ -738,6 +750,41 @@ esqlite_start(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
738750 return make_ok_tuple (env , db_conn );
739751}
740752
753+ int
754+ count_flag (ErlNifEnv * env , const ERL_NIF_TERM array [], int tuple_count )
755+ {
756+ char flag [30 ];
757+ int i , flag_count = 0 ;
758+ unsigned int flag_len = 0 ;
759+
760+ for (i = 0 ; i < tuple_count ; i ++ )
761+ {
762+ enif_get_atom_length (env , array [i ], & flag_len , ERL_NIF_LATIN1 );
763+ enif_get_atom (env , array [i ], flag , flag_len + 1 , ERL_NIF_LATIN1 );
764+ if (strcmp (flag , "readonly" ) == 0 )
765+ flag_count = flag_count | SQLITE_OPEN_READONLY ;
766+ else if (strcmp (flag , "readwrite" ) == 0 )
767+ flag_count = flag_count | SQLITE_OPEN_READWRITE ;
768+ else if (strcmp (flag , "create" ) == 0 )
769+ flag_count = flag_count | SQLITE_OPEN_CREATE ;
770+ else if (strcmp (flag , "uri" ) == 0 )
771+ flag_count = flag_count | SQLITE_OPEN_URI ;
772+ else if (strcmp (flag , "memory" ) == 0 )
773+ flag_count = flag_count | SQLITE_OPEN_MEMORY ;
774+ else if (strcmp (flag , "nomutex" ) == 0 )
775+ flag_count = flag_count | SQLITE_OPEN_NOMUTEX ;
776+ else if (strcmp (flag , "fullmutex" ) == 0 )
777+ flag_count = flag_count | SQLITE_OPEN_FULLMUTEX ;
778+ else if (strcmp (flag , "sharedcache" ) == 0 )
779+ flag_count = flag_count | SQLITE_OPEN_SHAREDCACHE ;
780+ else if (strcmp (flag , "privatecache" ) == 0 )
781+ flag_count = flag_count | SQLITE_OPEN_PRIVATECACHE ;
782+ else
783+ return -1 ;
784+ }
785+ return flag_count ;
786+ }
787+
741788/*
742789 * Open the database
743790 */
@@ -747,18 +794,27 @@ esqlite_open(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
747794 esqlite_connection * db ;
748795 esqlite_command * cmd = NULL ;
749796 ErlNifPid pid ;
797+ const ERL_NIF_TERM * array ;
798+ int tuple_count , flag_count ;
750799
751- if (argc != 4 )
800+ if (argc != 5 )
752801 return enif_make_badarg (env );
753802 if (!enif_get_resource (env , argv [0 ], esqlite_connection_type , (void * * ) & db ))
754803 return enif_make_badarg (env );
755804 if (!enif_is_ref (env , argv [1 ]))
756805 return make_error_tuple (env , "invalid_ref" );
757806 if (!enif_get_local_pid (env , argv [2 ], & pid ))
758807 return make_error_tuple (env , "invalid_pid" );
759-
760808 if (!sqlite3_threadsafe ())
761809 return make_error_tuple (env , "sqlite3 not thread safe." );
810+ if (!enif_get_tuple (env , argv [4 ], & tuple_count , & array ))
811+ return make_error_tuple (env , "invalid_tuple" );
812+
813+ flag_count = count_flag (env , array , tuple_count );
814+
815+ if (flag_count == -1 )
816+ return make_error_tuple (env , "unrecognize_flag" );
817+
762818
763819 /* Note, no check is made for the type of the argument */
764820 cmd = command_create ();
@@ -768,7 +824,7 @@ esqlite_open(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
768824 cmd -> type = cmd_open ;
769825 cmd -> ref = enif_make_copy (cmd -> env , argv [1 ]);
770826 cmd -> pid = pid ;
771- cmd -> arg = enif_make_copy (cmd -> env , argv [3 ]);
827+ cmd -> arg = enif_make_tuple2 ( cmd -> env , enif_make_copy (cmd -> env , argv [3 ]), enif_make_int ( cmd -> env , flag_count ) );
772828
773829 return push_command (env , db , cmd );
774830}
@@ -1153,7 +1209,7 @@ static int on_upgrade(ErlNifEnv* env, void** priv, void** old_priv_data, ERL_NIF
11531209
11541210static ErlNifFunc nif_funcs [] = {
11551211 {"start" , 0 , esqlite_start },
1156- {"open" , 4 , esqlite_open },
1212+ {"open" , 5 , esqlite_open },
11571213 {"exec" , 4 , esqlite_exec },
11581214 {"changes" , 3 , esqlite_changes },
11591215 {"prepare" , 4 , esqlite_prepare },
0 commit comments