11#![ allow( dead_code) ]
22use anyhow:: Result ;
33use http:: { Request , Response } ;
4- use spin_sdk:: {
5- http_component, pg3,
6- pg3:: { Date , Decode } ,
7- } ;
4+ use spin_sdk:: { http_component, pg3, pg3:: Decode } ;
85
96// The environment variable set in `spin.toml` that points to the
107// address of the Pg server that the component will write to
@@ -16,7 +13,10 @@ struct Article {
1613 title : String ,
1714 content : String ,
1815 authorname : String ,
19- published : Date ,
16+ published_date : chrono:: NaiveDate ,
17+ published_time : Option < chrono:: NaiveTime > ,
18+ published_datetime : Option < chrono:: NaiveDateTime > ,
19+ read_time : Option < i64 > ,
2020 coauthor : Option < String > ,
2121}
2222
@@ -28,15 +28,21 @@ impl TryFrom<&pg3::Row> for Article {
2828 let title = String :: decode ( & row[ 1 ] ) ?;
2929 let content = String :: decode ( & row[ 2 ] ) ?;
3030 let authorname = String :: decode ( & row[ 3 ] ) ?;
31- let published = Date :: decode ( & row[ 4 ] ) ?;
32- let coauthor = Option :: < String > :: decode ( & row[ 5 ] ) ?;
31+ let published_date = chrono:: NaiveDate :: decode ( & row[ 4 ] ) ?;
32+ let published_time = Option :: < chrono:: NaiveTime > :: decode ( & row[ 5 ] ) ?;
33+ let published_datetime = Option :: < chrono:: NaiveDateTime > :: decode ( & row[ 6 ] ) ?;
34+ let read_time = Option :: < i64 > :: decode ( & row[ 7 ] ) ?;
35+ let coauthor = Option :: < String > :: decode ( & row[ 8 ] ) ?;
3336
3437 Ok ( Self {
3538 id,
3639 title,
3740 content,
3841 authorname,
39- published,
42+ published_date,
43+ published_time,
44+ published_datetime,
45+ read_time,
4046 coauthor,
4147 } )
4248 }
@@ -47,6 +53,7 @@ fn process(req: Request<()>) -> Result<Response<String>> {
4753 match req. uri ( ) . path ( ) {
4854 "/read" => read ( req) ,
4955 "/write" => write ( req) ,
56+ "/write_datetime_info" => write_datetime_info ( req) ,
5057 "/pg_backend_pid" => pg_backend_pid ( req) ,
5158 _ => Ok ( http:: Response :: builder ( )
5259 . status ( 404 )
@@ -58,7 +65,7 @@ fn read(_req: Request<()>) -> Result<Response<String>> {
5865 let address = std:: env:: var ( DB_URL_ENV ) ?;
5966 let conn = pg3:: Connection :: open ( & address) ?;
6067
61- let sql = "SELECT id, title, content, authorname, published , coauthor FROM articletest" ;
68+ let sql = "SELECT id, title, content, authorname, publisheddate, publishedtime, publisheddatetime, readtime , coauthor FROM articletest" ;
6269 let rowset = conn. query ( sql, & [ ] ) ?;
6370
6471 let column_summary = rowset
@@ -89,6 +96,31 @@ fn read(_req: Request<()>) -> Result<Response<String>> {
8996 Ok ( http:: Response :: builder ( ) . status ( 200 ) . body ( response) ?)
9097}
9198
99+ fn write_datetime_info ( _req : Request < ( ) > ) -> Result < Response < String > > {
100+ let address = std:: env:: var ( DB_URL_ENV ) ?;
101+ let conn = pg3:: Connection :: open ( & address) ?;
102+
103+ let date: chrono:: NaiveDate = chrono:: NaiveDate :: from_ymd_opt ( 2024 , 1 , 1 ) . unwrap ( ) ;
104+ let time: chrono:: NaiveTime = chrono:: NaiveTime :: from_hms_nano_opt ( 12 , 34 , 56 , 1 ) . unwrap ( ) ;
105+ let datetime: chrono:: NaiveDateTime = chrono:: NaiveDateTime :: new ( date, time) ;
106+ let readtime = 123i64 ;
107+
108+ let nrow_executed = conn. execute (
109+ "INSERT INTO articletest(title, content, authorname, publisheddate, publishedtime, publisheddatetime, readtime) VALUES ($1, $2, $3, $4, $5, $6, $7)" ,
110+ & [ "aaa" . to_string ( ) . into ( ) , "bbb" . to_string ( ) . into ( ) , "ccc" . to_string ( ) . into ( ) , date. into ( ) , time. into ( ) , datetime. into ( ) , readtime. into ( ) ] ,
111+ ) ;
112+
113+ println ! ( "nrow_executed: {:?}" , nrow_executed) ;
114+
115+ let sql = "SELECT COUNT(id) FROM articletest" ;
116+ let rowset = conn. query ( sql, & [ ] ) ?;
117+ let row = & rowset. rows [ 0 ] ;
118+ let count = i64:: decode ( & row[ 0 ] ) ?;
119+ let response = format ! ( "Count: {}\n " , count) ;
120+
121+ Ok ( http:: Response :: builder ( ) . status ( 200 ) . body ( response) ?)
122+ }
123+
92124fn write ( _req : Request < ( ) > ) -> Result < Response < String > > {
93125 let address = std:: env:: var ( DB_URL_ENV ) ?;
94126 let conn = pg3:: Connection :: open ( & address) ?;
0 commit comments