119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2007 Chris Double. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								!
							 | 
						||
| 
								 | 
							
								USING: kernel sqlite sqlite.tuple-db io.files sequences splitting
							 | 
						||
| 
								 | 
							
								       hashtables ;
							 | 
						||
| 
								 | 
							
								IN: webapps.article-manager.database
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: site hostname title intro footer html ad1 ad2 ad3 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <site> site
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: article hostname url pubdate title status body tags ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <article> article
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: tag hostname name title description ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <tag> tag
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								site default-mapping set-mapping
							 | 
						||
| 
								 | 
							
								article default-mapping set-mapping
							 | 
						||
| 
								 | 
							
								tag default-mapping set-mapping 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: db ( -- object )
							 | 
						||
| 
								 | 
							
								  { f } ;	    
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: set-db ( value -- )
							 | 
						||
| 
								 | 
							
								  0 db set-nth ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-db ( -- value )
							 | 
						||
| 
								 | 
							
								  0 db nth ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: db-filename ( -- name )
							 | 
						||
| 
								 | 
							
								  "extra/webapps/article-manager/article-manager.db" resource-path ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: open-db ( -- )
							 | 
						||
| 
								 | 
							
								  get-db [ sqlite-close ] when*
							 | 
						||
| 
								 | 
							
								  db-filename exists? [
							 | 
						||
| 
								 | 
							
								    db-filename sqlite-open set-db 
							 | 
						||
| 
								 | 
							
								  ] [
							 | 
						||
| 
								 | 
							
								    db-filename sqlite-open dup set-db
							 | 
						||
| 
								 | 
							
								    dup article create-tuple-table
							 | 
						||
| 
								 | 
							
								    dup site create-tuple-table
							 | 
						||
| 
								 | 
							
								    tag create-tuple-table
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: close-db ( -- )
							 | 
						||
| 
								 | 
							
								  get-db [ sqlite-close ] when*
							 | 
						||
| 
								 | 
							
								  f set-db ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: all-sites ( -- sites )
							 | 
						||
| 
								 | 
							
								  get-db f f f f f f f f <site> find-tuples ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-site ( hostname -- site )
							 | 
						||
| 
								 | 
							
								  f f f f f f f <site> get-db swap find-tuples dup empty? [ 
							 | 
						||
| 
								 | 
							
								    drop f
							 | 
						||
| 
								 | 
							
								  ] [ 
							 | 
						||
| 
								 | 
							
								    first 
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-site* ( hostname -- site )
							 | 
						||
| 
								 | 
							
								  f f f f f f f <site> dup get-db swap find-tuples dup empty? [ 
							 | 
						||
| 
								 | 
							
								    drop site-hostname dup "" "" "" "" "" "" <site> 
							 | 
						||
| 
								 | 
							
								  ] [ 
							 | 
						||
| 
								 | 
							
								    nip first 
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-tag ( hostname name -- tag )
							 | 
						||
| 
								 | 
							
								  f f <tag> dup get-db swap find-tuples dup empty? [ 
							 | 
						||
| 
								 | 
							
								    drop 
							 | 
						||
| 
								 | 
							
								    [ dup tag-name swap set-tag-title ] keep
							 | 
						||
| 
								 | 
							
								    [ "" swap set-tag-description ] keep
							 | 
						||
| 
								 | 
							
								  ] [ 
							 | 
						||
| 
								 | 
							
								    nip first 
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: add-article ( article -- )
							 | 
						||
| 
								 | 
							
								  get-db swap insert-tuple ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: remove-article ( article -- )
							 | 
						||
| 
								 | 
							
								  get-db swap delete-tuple ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: save-article ( article -- )
							 | 
						||
| 
								 | 
							
								  get-db swap save-tuple ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: all-articles ( hostname -- seq )
							 | 
						||
| 
								 | 
							
								  f f f "published" f f <article> get-db swap find-tuples ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: article-by-url ( hostname url -- article )
							 | 
						||
| 
								 | 
							
								  f f f f f <article> get-db swap find-tuples dup empty? [
							 | 
						||
| 
								 | 
							
								    drop f
							 | 
						||
| 
								 | 
							
								  ] [ 
							 | 
						||
| 
								 | 
							
								    first
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: article-by-url* ( hostname url -- article )
							 | 
						||
| 
								 | 
							
								  f f f f f <article> dup get-db swap find-tuples dup empty? [
							 | 
						||
| 
								 | 
							
								    drop 
							 | 
						||
| 
								 | 
							
								    [ "" swap set-article-pubdate ] keep
							 | 
						||
| 
								 | 
							
								    [ "" swap set-article-title ] keep
							 | 
						||
| 
								 | 
							
								    [ "draft" swap set-article-status ] keep
							 | 
						||
| 
								 | 
							
								    [ "" swap set-article-body ] keep
							 | 
						||
| 
								 | 
							
								    [ "" swap set-article-tags ] keep
							 | 
						||
| 
								 | 
							
								  ] [ 
							 | 
						||
| 
								 | 
							
								    nip first
							 | 
						||
| 
								 | 
							
								  ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: tags-for-article ( article -- seq )
							 | 
						||
| 
								 | 
							
								  article-tags " " split [ empty? not ] subset ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: all-tags ( hostname -- seq )
							 | 
						||
| 
								 | 
							
								  all-articles [ tags-for-article ] map concat prune ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: articles-for-tag ( tag -- seq )
							 | 
						||
| 
								 | 
							
								  [ tag-name ] keep tag-hostname all-articles [
							 | 
						||
| 
								 | 
							
								    tags-for-article member?
							 | 
						||
| 
								 | 
							
								  ] curry* subset ;
							 |