55
66int main (int argc , char * argv [])
77{
8- libsql_connection_t conn ;
9- libsql_rows_t rows ;
10- libsql_row_t row ;
11- libsql_database_t db ;
8+ libsql_connection_t conn = NULL ;
9+ libsql_rows_t rows = NULL ;
10+ libsql_row_t row = NULL ;
11+ libsql_database_t db = NULL ;
1212 libsql_config config ;
1313 const char * err = NULL ;
1414 int retval = 0 ;
@@ -20,9 +20,10 @@ int main(int argc, char *argv[])
2020 char auth_token [1024 ];
2121 auth_token [0 ] = '\0' ;
2222 if (argc > 2 ) {
23- strncpy (auth_token , argv [ 2 ], strlen ( argv [2 ]) );
23+ snprintf (auth_token , sizeof ( auth_token ), "%s" , argv [2 ]);
2424 }
25- strncpy (db_path , "test.db" , strlen ("test.db" ));
25+ snprintf (db_path , sizeof (db_path ), "%s" , "test.db" );
26+ memset (& config , 0 , sizeof (config ));
2627 config .db_path = db_path ;
2728 config .primary_url = url ;
2829 config .auth_token = auth_token ;
@@ -56,16 +57,123 @@ int main(int argc, char *argv[])
5657 goto quit ;
5758 }
5859
59- retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hi there')" , & err );
60- if (retval != 0 ) {
61- fprintf (stderr , "%s\n" , err );
62- goto quit ;
60+ // --- ROLLBACK should discard changes
61+ {
62+ libsql_tx_t tx = NULL ;
63+ retval = libsql_tx_begin (conn , 0 /* Deferred */ , & tx , & err );
64+ if (retval != 0 ) {
65+ fprintf (stderr , "tx_begin (rollback test): %s\n" , err );
66+ goto quit ;
67+ }
68+
69+ retval = libsql_execute (conn , "DELETE FROM guest_book_entries" , & err );
70+ if (retval != 0 ) {
71+ fprintf (stderr , "delete before rollback test: %s\n" , err );
72+ libsql_tx_free (tx );
73+ goto quit ;
74+ }
75+
76+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('tx will be rolled back')" , & err );
77+ if (retval != 0 ) {
78+ fprintf (stderr , "insert (rollback test): %s\n" , err );
79+ libsql_tx_free (tx );
80+ goto quit ;
81+ }
82+
83+ retval = libsql_tx_rollback (tx , & err );
84+ if (retval != 0 ) {
85+ fprintf (stderr , "tx_rollback: %s\n" , err );
86+ libsql_tx_free (tx );
87+ goto quit ;
88+ }
89+ tx = NULL ;
90+
91+ rows = NULL ; row = NULL ; err = NULL ;
92+ retval = libsql_query (conn , "SELECT COUNT(*) FROM guest_book_entries" , & rows , & err );
93+ if (retval != 0 ) {
94+ fprintf (stderr , "query count after rollback: %s\n" , err );
95+ goto quit ;
96+ }
97+ retval = libsql_next_row (rows , & row , & err );
98+ if (retval != 0 || !row ) {
99+ fprintf (stderr , "next_row (count after rollback): %s\n" , err ? err : "no row" );
100+ goto quit ;
101+ }
102+ long long count = -1 ;
103+ retval = libsql_get_int (row , 0 , & count , & err );
104+ if (retval != 0 ) {
105+ fprintf (stderr , "get_int (count after rollback): %s\n" , err );
106+ goto quit ;
107+ }
108+ libsql_free_row (row ); row = NULL ;
109+ libsql_free_rows (rows ); rows = NULL ;
110+
111+ if (count != 0 ) {
112+ fprintf (stderr , "rollback test failed: expected 0 rows, got %lld\n" , count );
113+ retval = 1 ;
114+ goto quit ;
115+ } else {
116+ printf ("[tx-rollback] OK: count=%lld\n" , count );
117+ }
63118 }
64119
65- retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('some more hi there')" , & err );
66- if (retval != 0 ) {
67- fprintf (stderr , "%s\n" , err );
68- goto quit ;
120+ // --- COMMIT should persist changes
121+ {
122+ libsql_tx_t tx = NULL ;
123+ retval = libsql_tx_begin (conn , 0 /* Deferred */ , & tx , & err );
124+ if (retval != 0 ) {
125+ fprintf (stderr , "tx_begin (commit test): %s\n" , err );
126+ goto quit ;
127+ }
128+
129+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hello from tx-commit 1')" , & err );
130+ if (retval != 0 ) {
131+ fprintf (stderr , "insert 1 (commit test): %s\n" , err );
132+ libsql_tx_free (tx );
133+ goto quit ;
134+ }
135+ retval = libsql_execute (conn , "INSERT INTO guest_book_entries VALUES('hello from tx-commit 2')" , & err );
136+ if (retval != 0 ) {
137+ fprintf (stderr , "insert 2 (commit test): %s\n" , err );
138+ libsql_tx_free (tx );
139+ goto quit ;
140+ }
141+
142+ retval = libsql_tx_commit (tx , & err );
143+ if (retval != 0 ) {
144+ fprintf (stderr , "tx_commit: %s\n" , err );
145+ libsql_tx_free (tx );
146+ goto quit ;
147+ }
148+
149+ tx = NULL ;
150+ rows = NULL ; row = NULL ; err = NULL ;
151+ retval = libsql_query (conn , "SELECT COUNT(*) FROM guest_book_entries" , & rows , & err );
152+ if (retval != 0 ) {
153+ fprintf (stderr , "query count after commit: %s\n" , err );
154+ goto quit ;
155+ }
156+ retval = libsql_next_row (rows , & row , & err );
157+ if (retval != 0 || !row ) {
158+ fprintf (stderr , "next_row (count after commit): %s\n" , err ? err : "no row" );
159+ goto quit ;
160+ }
161+ long long count = -1 ;
162+ retval = libsql_get_int (row , 0 , & count , & err );
163+ if (retval != 0 ) {
164+ fprintf (stderr , "get_int (count after commit): %s\n" , err );
165+ goto quit ;
166+ }
167+ libsql_free_row (row ); row = NULL ;
168+ libsql_free_rows (rows ); rows = NULL ;
169+
170+ if (count != 2 ) {
171+ fprintf (stderr , "commit test failed: expected 2 rows, got %lld\n" , count );
172+ retval = 1 ;
173+ goto quit ;
174+ } else {
175+ printf ("[tx-commit] OK: count=%lld\n" , count );
176+ }
69177 }
70178
71179 retval = libsql_query (conn , "SELECT text FROM guest_book_entries" , & rows , & err );
@@ -87,6 +195,9 @@ int main(int argc, char *argv[])
87195 libsql_free_string (value );
88196 value = NULL ;
89197 }
198+
199+ libsql_free_row (row );
200+ row = NULL ;
90201 err = NULL ;
91202 }
92203
@@ -106,9 +217,10 @@ int main(int argc, char *argv[])
106217 }
107218
108219quit :
109- libsql_free_rows (rows );
110- libsql_disconnect (conn );
111- libsql_close (db );
220+ if (row ) libsql_free_row (row );
221+ if (rows ) libsql_free_rows (rows );
222+ if (conn ) libsql_disconnect (conn );
223+ if (db ) libsql_close (db );
112224
113225 return retval ;
114226}
0 commit comments