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