79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2007 Berlin Brown, 2008 Doug Coleman. | ||
|  | ! See http://factorcode.org/license.txt for license. | ||
|  | ! Adapted from mysql.h and mysql.c | ||
|  | ! Tested with MySQL version - 5.0.24a | ||
|  | USING: kernel alien io prettyprint sequences | ||
|  | namespaces arrays math db.mysql.ffi system accessors ;
 | ||
|  | IN: db.mysql.lib | ||
|  | 
 | ||
|  | SYMBOL: my-conn | ||
|  | 
 | ||
|  | TUPLE: mysql-db handle host user password db port ;
 | ||
|  | TUPLE: mysql-statement ;
 | ||
|  | TUPLE: mysql-result-set ;
 | ||
|  | 
 | ||
|  | : new-mysql ( -- conn )
 | ||
|  |     f mysql_init ;
 | ||
|  | 
 | ||
|  | : mysql-error ( mysql -- )
 | ||
|  |     [ mysql_error throw ] when* ;
 | ||
|  | 
 | ||
|  | ! : mysql-connect ( mysql-connection -- ) | ||
|  |     ! new-mysql over set-mysql-db-handle | ||
|  |     ! dup { | ||
|  |         ! mysql-db-handle | ||
|  |         ! mysql-db-host | ||
|  |         ! mysql-db-user | ||
|  |         ! mysql-db-password | ||
|  |         ! mysql-db-db | ||
|  |         ! mysql-db-port | ||
|  |     ! } get-slots f 0 mysql_real_connect mysql-error ; | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Low level mysql utility definitions | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : (mysql-query) ( mysql-connection query -- ret )
 | ||
|  |     >r db-handle>> r> mysql_query ;
 | ||
|  | 
 | ||
|  | ! : (mysql-result) ( mysql-connection -- ret ) | ||
|  |     ! [ mysql-db-handle mysql_use_result ] keep  | ||
|  |     ! [ set-mysql-connection-resulthandle ] keep ; | ||
|  | 
 | ||
|  | ! : (mysql-affected-rows) ( mysql-connection -- n ) | ||
|  |     ! mysql-connection-mysqlconn mysql_affected_rows ; | ||
|  | 
 | ||
|  | ! : (mysql-free-result) ( mysql-connection -- ) | ||
|  |     ! mysql-connection-resulthandle drop ; | ||
|  | 
 | ||
|  | ! : (mysql-row) ( mysql-connection -- row ) | ||
|  |     ! mysql-connection-resulthandle mysql_fetch_row ; | ||
|  | 
 | ||
|  | ! : (mysql-num-cols) ( mysql-connection -- n ) | ||
|  |     ! mysql-connection-resulthandle mysql_num_fields ; | ||
|  |     | ||
|  | ! : mysql-char*-nth ( index object -- str ) | ||
|  |     ! #! Utility based on 'char*-nth' to perform an additional sanity check on the value | ||
|  |     ! #! extracted from the array of strings. | ||
|  |     ! void*-nth [ alien>char-string ] [ "" ] if* ; | ||
|  | 
 | ||
|  | ! : mysql-row>seq ( object n -- seq ) | ||
|  |     ! [ swap mysql-char*-nth ] map-with ; | ||
|  | 
 | ||
|  | ! : (mysql-result>seq) ( seq -- seq ) | ||
|  |     ! my-conn get (mysql-row) dup [        | ||
|  |         ! my-conn get (mysql-num-cols) mysql-row>seq | ||
|  |         ! over push | ||
|  |         ! (mysql-result>seq) | ||
|  |     ! ] [ drop ] if  | ||
|  |     ! ! Perform needed cleanup on fetched results | ||
|  |     ! my-conn get (mysql-free-result) ; | ||
|  | 
 | ||
|  | ! : mysql-query ( query -- ret ) | ||
|  |     ! >r my-conn get r> (mysql-query) drop | ||
|  |     ! my-conn get (mysql-result) ; | ||
|  | 
 | ||
|  | ! : mysql-command ( query -- n ) | ||
|  |     ! mysql-query drop | ||
|  |     ! my-conn get (mysql-affected-rows) ; |