Quantcast
Channel: IBM Mainframe Computers Forums
Viewing all 8500 articles
Browse latest View live

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: RahulG31
Subject: Reply to: SQL query to run through list of values in table
Posted: Thu Dec 15, 2016 3:08 am (GMT 5.5)

Quote:
RahulG31, I think, you are missing the relation between two tables.

I know. But from the original post, it is Not entirely clear whether the Table 2 will have an ID column (or possibly Not).

The tables may be like:

Table 1 as
Code:
ID
1
2
3

And Table 2 as:
Code:
CODE
A
B
C
D
E
F
G

And then, what the TS wants may be something like:
Code:
ID CODE
1 X
1 X
1 X
1 B
1 A
1 C
1 D
2 X
2 X
2 X
2 B
2 A
2 C
2 D
And so on . . .


TSO/ISPF :: RE: ISPF task abend - 3E7

$
0
0
Author: nbenazic
Posted: Thu Dec 15, 2016 9:15 am (GMT 5.5)

I found that the ISPF profile dataset was full after trying to save some changes.
Compressed the ISPF dataset and then redoing the operation fixed that issue.
Increasing the ISPF dataset was performed by a colleague, once I logged off - to prevent / minimise the issue from reoccurring in the future.
The issue has not occurred since - so far so good.
_________________
Regards,
Nik Benazic

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Ni3-db2
Subject: Reply to: SQL query to run through list of values in table
Posted: Thu Dec 15, 2016 9:37 am (GMT 5.5)

First of all thank you for your reply guys.
Sorry if i was not able to make requirment clear in first place.

Table 1 has only ID and there is no CODE column in it
Table 2 has CODE and no ID in it.

We match these tables based on some other common column.

Here is sample

Table 1

Code:
ID    timestamp   
abc    12:00
abc    13:00


Table 2

Code:
CODE
A
B1
C1


so one ID have three code. so here there will be total 6 rows.

The output expected is

Since A is one of the valid code.

Code:
abc  A
abc  A


if there is no valid code

output expected is

Code:
abc X
abc X


so if valid value of code is there same value should be repeated for that ID (if there are multiple ID rows are there in Table 1)

also in Table 2 there can be only one valid value of the CODE

that means there will be either A,B,C or D though it may have any other values of CODE but valid value can only be one.

Hope i am clear with requirement now.
_________________
Nitin gandhi

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Rohit Umarjikar
Posted: Thu Dec 15, 2016 11:20 am (GMT 5.5)

Did you care to look at the solutions given so far? Please try it.

All you got to do is ,replace ID by the right columns in the joins between tables.Try solution given by Arun first, modify to have it sorted per your expectations.

What should happen if there is no entry in table 2 ?
_________________
Regards,
Rohit Umarjikar
"Knowledge is knowing that a tomato is a fruit, but Wisdom is knowing not to put it in a fruit salad."icon_razz.gif

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: RahulG31
Subject: Reply to: SQL query to run through list of values in table
Posted: Thu Dec 15, 2016 11:47 am (GMT 5.5)

Since, I like my own query, I would simply modify that as:
Code:
SELECT ID, MIN(CODE)
FROM
(
SELECT
 A.ID as ID,
 CASE B.CODE
    WHEN 'A' THEN 'A'
    WHEN 'B' THEN 'B'
    WHEN 'C' THEN 'C'
    WHEN 'D' THEN 'D'
    ELSE 'X'
 END as CODE,
 CASE B.CODE
    WHEN 'A' THEN '3A'
    WHEN 'B' THEN '2B'
    WHEN 'C' THEN '4C'
    WHEN 'D' THEN '5D'
    ELSE '1X'
 END AS MY_ORDER
FROM TABLE1 A, TABLE2 B
WHERE A.MATCHING_COLUMN = B.MATCHING_COLUMN
ORDER BY 1,3,2
)
GROUP BY ID;

CLIST & REXX :: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: anandgbe
Subject: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO
Posted: Thu Dec 15, 2016 4:20 pm (GMT 5.5)

I am new to REXX. Actually I have couple of questions.

I created a REXX tool names as 'B' to take a Browse a file. Whenever I type in 'B' in the command line and then place the cursor over the Dataset name and will Press enter to Browse the file.
I have added this rexx tool's PDS file to SYSPROC.

1) But When I try to run this Browse tool by typing as 'B' in the command line, it runs only when the dataset is in the edit/view mode. IF I have opened the dataset in Browse mode(non-editable mode), the REXX tool 'B' gets triggered only if I type as 'TSO B' in the command line.

I wish to use just 'B' in all the cases, without using the keyword TSO. Please suggest me how to get rid of this TSO command/Keyword in non-editable screens.


2) 2nd Question is: There are 2 error messages doing validation of dataset one is ZEDSMSG and another is ZEDLMSG. I wish to display both the message at the same time. But the system is expecting to Press F1/Help to display ZEDLMSG.

How to display both ZEDSMSG and ZEDLMSG at the same time without any manual intervention.


Code(Got it from some forum. Its working fine)

Code:
/* REXX B*/
ADDRESS ISPEXEC "CONTROL ERRORS RETURN"
ADDRESS ISREDIT "MACRO ("DSN") PROCESS"
'ISREDIT (ROW1, COL1) = CURSOR'
IF DSN <> "" THEN DO
IF DSN == 'DSN' THEN
DO
CALL BROWSE1
EXIT
END
ELSE
DO
SYSFILE1=DSN
END
END
ELSE DO
IF DATATYPE(COL1,'N')==1 THEN DO
IF COL1 = '00000' THEN EXIT
ADDRESS ISREDIT "(CURLINE) = LINE .ZCSR"
DELIM   = "~'!%?&-_=+?\{};:`<,>/?*()@#$¬|" '"'
LOFLINE = LENGTH(CURLINE)
HQUAL   = USERID()
START   = LOFLINE - VERIFY(REVERSE(CURLINE),DELIM,"M",LOFLINE-COL1+1)+2
LOFLINE = VERIFY(CURLINE,DELIM,"M",COL1)-1
IF START <= LOFLINE THEN
SYSFILE1 = STRIP(SUBSTR(CURLINE,START,LOFLINE-START+1))
ELSE DO
ZEDSMSG = "INVALID CURSOR POSITION"
ZEDLMSG = "INVALID CURSOR POSITION. PLACE THE CURSOR OVER THE DATASET"
'ISPEXEC SETMSG MSG(ISRZ001)'
EXIT
END
TEMP    =LISTDSI("'"SYSFILE1"'")
IF(SYSREASON /= '0000')
THEN DO
ZEDSMSG = "INVALID DATASET NAME"
ZEDLMSG = "INVALID DATASET NAME : '"SYSFILE1"'"
'ISPEXEC SETMSG MSG(ISRZ001)'
EXIT
END
END
END
ADDRESS ISPEXEC "BROWSE DATASET('"SYSFILE1"')"
EXIT


BROWSE1:
ADDRESS ISPEXEC
'VGET (ZSCREENI,ZSCREENC,ZENVIR)'      /* EXTRACT SCREEN IMAGE,
CURSOR POS AND ISPF LEVEL  */
IF SUBSTR(ZENVIR,5,4) < '4.5' THEN
CALL GET_ZSCREEN_VALUES
TRTABLE='ABCDEFGHIJKLMNOPQRSTUVWXYZ'   /* SETUP VALID DSNAME CHARS   */
TRTABLE=TRTABLE !! TRANSLATE(TRTABLE) !! '$#@0123456789.''-{()'
TRTABLE=TRANSLATE(XRANGE('00'X,'FF'X),,TRTABLE,' ')
ZSCREENI=TRANSLATE(ZSCREENI,,TRTABLE,' ') /* REMOVE NON-DSN CHARS    */
IF SUBSTR(ZSCREENI,ZSCREENC+1,1) <> ' ' THEN /* MAYBE CSR ON DSN     */
DO                                   /* EXTRACT DSN FROM SCREEN IMAGE
AND BROSWE DATASET         */
NAME=WORD(SUBSTR(ZSCREENI,1+LASTPOS(' ',ZSCREENI,ZSCREENC)),1)
NAME=TRANSLATE(STRIP(SUBSTR(NAME,1,56))) /* MAX OF 56 CHAR NAME  */
IF SUBSTR(NAME,1,1)='(' THEN
PARSE VAR NAME '('NAME')'.
PARSE VAR NAME DSN '('MEM')'       /* IS THERE A MEMBER NAME?    */
OMEM=MEM
IF MEM<>'' THEN                    /* IF SO, REFORMAT FOR BROWSE
CMD                        */
DO
GDG=0
NAME=DSN                       /* GET DSN                    */
IF SUBSTR(NAME,1,1)='''' THEN  /* IF ORIGINAL NAME STARTED WITH
QUOTES                     */
NAME=NAME''''                /* FIX QUOTES                 */
IF DATATYPE(MEM,'N') = 1 THEN  /* GDG?                       */
DO
DROP OTRAP.
CALL OUTTRAP 'OTRAP.'
ADDRESS TSO 'LISTCAT ENT('NAME')' /* GET REAL GDG NAMES  */
CALL OUTTRAP 'OFF'
IF OTRAP.0>(2-2*MEM) THEN  /* IF ENOUGH LINES RETURNED   */
DO
A=OTRAP.0-1+2*MEM      /* PARSE LISTCAT OUTPUT       */
N="'"SUBWORD(OTRAP.A,3,1)"'" /* GET REAL DSNAME      */
IF SYSDSN(N)='OK' THEN /* VERIFY THAT DS EXISTS      */
DO                   /* IF REAL GDG NAME EXISTS    */
NAME=N             /* USE REA NAME AS DSNAME     */
MEM=''             /* FORGET THE MEMBER NAME     */
OMEM=''            /* FORGET THE MEMBER NAME     */
GDG=1              /* INDICATE WE FORGOT MEMBER
NAME                       */
END
END
END
IF GDG=0 THEN                  /* IF GDG CHECK FAILED        */
MEM='MEMBER('MEM')'          /* ADD MEMBER KEYWORD FOR BR  */
END
'CONTROL ERRORS RETURN'            /* RETURN ERRORS TO PROGRAM   */
'LMINIT DATAID(VCURSOR) DATASET('NAME')' /* ALLOC W/ TSO NAMING  */
IF RC>0 & SUBSTR(NAME,1,1) <> "'" THEN /* ALLOC W/O TSO NAME     */
'LMINIT DATAID(VCURSOR) DATASET('''NAME''')'
IF RC=0 THEN
DO
SERVICE=TRANSLATE(SERVICE)
IF SERVICE<>"" THEN
SERVICE 'DATAID('VCURSOR')' MEM    /* BROWSE THE DATASET   */
END
ELSE                               /* ALLOCS FAILED: SET ORIGINAL
MESSAGE                    */
'LMINIT DATAID(VCURSOR) DATASET('NAME')'
IF RC>7 THEN
'SETMSG MSG(ISRZ002)'            /* IF ERROR, SHOW MESSAGES    */
'LMFREE DATAID(&VCURSOR)'          /* FREE DS IF ALLOCATED       */
END
ELSE                                   /* CURSOR WAS NOT ON A DSNAME */
DO                                   /* GIVE USER AN ERROR MESSAGE */
ZERRSM = 'INVALID CURSOR POSITION'
PARSE VALUE '* YES THE CURSOR WAS NOT ON A DATA SET NAME.',
WITH ZERRHM ZERRALRM ZERRLM
'SETMSG MSG(ISRZ002)'
END
XIT 0

GET_ZSCREEN_VALUES:                    /* OBTAIN THE SCREEN IMAGE    */
ADDRESS ISPEXEC 'VGET (ZSCREENW,ZSCREEND)'
P = PTR(96+PTR(PTR(24+PTR(112+PTR(132+PTR(540))))))
ZSCREENI=TRANSLATE(STORAGE(D2X(P),,
ZSCREENW*ZSCREEND),,XRANGE('00'X,'3F'X))
ZSCREENC = C2D(STORAGE(,
D2X(164+PTR(PTR(24+PTR(112+PTR(132+PTR(540)))))),4))
RETURN


PTR:  RETURN C2D(BITAND(STORAGE(D2X(ARG(1)),4),'7FFFFFFF'X))

_________________
Thanks & Regards,
Anand Gunsekaran

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Ni3-db2
Posted: Thu Dec 15, 2016 5:42 pm (GMT 5.5)

i came up the sql what arun wote , that will not work as it will give multiple rows.
_________________
Nitin gandhi

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Ni3-db2
Posted: Thu Dec 15, 2016 5:48 pm (GMT 5.5)

One more try to explian req.

Table 1
Code:
ID   TIME   MERCHANT      
ABC   12:00   1      
ABC   13:00   1   


Table 2
Code:
Code   Merchant         
A   1         
B1   1         
C1   1   



Output
Code:
ABC   12:00   A      
ABC   13:00   A      
            



IF CODE IS NOT ONE OF THE VALID CODE (A,B,C,D)

That is if the table 2 is as below

Table 2
Code:
Code   Merchant         
A1   1         
B1   1         
C1   1   


Output
Code:
ABC   12:00   X      
ABC   13:00   X      

_________________
Nitin gandhi


DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Arun Raj
Posted: Thu Dec 15, 2016 7:12 pm (GMT 5.5)

Quote:
i came up the sql what arun wote , that will not work as it will give multiple rows
But in your recent post you mentioned,
Quote:
if valid value of code is there same value should be repeated for that ID


Can you show what have you tried and what are you getting out of it? Based on the new details, you might need to change it to JOIN on both ID and MERCHANT. However the question on whether ID, MERCHANT keys from table1 will always be available in table2, and if not what would be the expected output still remains.
_________________
Arun
----------------------------------------------------------------------------------------------------
Love is like an hourglass, with the heart filling up as the brain empties. -Jules Renard

CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: Nic Clouston
Posted: Thu Dec 15, 2016 8:18 pm (GMT 5.5)

Please use the code tags when posting data/code. Thet maintain spacing. Your posted code appears to have no indentation - if that is true then I suggest the first thing you do is indent it properly.
_________________
Regards
Nic

DB2 :: RE: SQL query to run through list of values in table

$
0
0
Author: Rohit Umarjikar
Posted: Thu Dec 15, 2016 10:12 pm (GMT 5.5)

I still don't get why Arun's query doesn't work for what you wanted except sorting. So let us know in what case his query will fail.
Please try this.
Code:
select t4.ID,
       t4.code
from
(SELECT
  ID,
  code,
  case
       when code = 'B' then 2
       when code = 'A' then 3
       when code = 'C' then 4 
       when code = 'D' then 5
  end
  FROM TABLE1 T1, TABLE2 T2
where
    t1.Merchant = t2.Merchant
AND EXISTS ( select  1 form table2 t3
         where t1.Merchant = t3.Merchant
            and t3.code in ('A','B','C','D'))
UNION
 SELECT
  ID,
  'X',
  1
  FROM TABLE1 T1, TABLE2 T2
where
    t1.Merchant = t2.Merchant
AND EXISTS ( select  1 form table2 t3
         where t1.Merchant = t3.Merchant
            and t3.code  not in ('A','B','C','D'))
AND NOT EXISTS ( select  1 form table2 t3
         where t1.Merchant = t3.Merchant
            and t3.code in ('A','B','C','D'))
order by 3) t4

_________________
Regards,
Rohit Umarjikar
"Knowledge is knowing that a tomato is a fruit, but Wisdom is knowing not to put it in a fruit salad."icon_razz.gif

CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: Pedro
Subject: Reply to: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO
Posted: Thu Dec 15, 2016 11:00 pm (GMT 5.5)

Quote:
How to display both ZEDSMSG and ZEDLMSG at the same time


Those are the short message and the long message text. If you only want the long message, do not provide the short message.

You said you want both... but in this situation the long message text already includes the short message text, so I do not think it is necessary to actually combine the text. In other situations, just make the long message text to have the text you want to show.
_________________
Pedro Vera

CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: Pedro
Subject: Reply to: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO
Posted: Thu Dec 15, 2016 11:06 pm (GMT 5.5)

The logic of your tool relies on editor macro statements. Those statements will not work outside of edit (or view). Nor will they work if you issue a "TSO B" command. What you are trying to do will not work.

But in general, if you do want to shorten the keystrokes, use a PF key or add an entry to your USERCMDS table.
_________________
Pedro Vera

CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: daveporcelan
Posted: Thu Dec 15, 2016 11:14 pm (GMT 5.5)

Quote:
ADDRESS ISREDIT "MACRO ("DSN") PROCESS"


You have written and EDIT macro.

This means you need to use edit (or view) to invoke this macro.

Even if you invoke with TSO first, it will not work as the ISREDIT commands will fail.

While it can be done while in Browse, it is a lot of trial and error of new techniques. Not worth it in my book.

Quote:
I wish to use just 'B' in all the cases, without using the keyword TSO. Please suggest me how to get rid of this TSO command/Keyword in non-editable screens.


As the Rolling Stones once said: You can't always get what you want.

CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: anandgbe
Posted: Fri Dec 16, 2016 10:41 am (GMT 5.5)

Hi All, Thanks for your most valuable time.

Hi Pedro,

Quote:
You said you want both... but in this situation the long message text already includes the short message text, so I do not think it is necessary to actually combine the text. In other situations, just make the long message text to have the text you want to show.


I removed the short message as you suggested. Using only ZEDLMSG. Thanks!!!

Quote:
The logic of your tool relies on editor macro statements. Those statements will not work outside of edit (or view). Nor will they work if you issue a "TSO B" command. What you are trying to do will not work.

Regarding TSO B: Yes its working in non-editable screen while using 'TSO B'. If the screen is non-editable, The DSN always contains value 'DSN', hence 'Browse1' Module is called, which converts non-editable into editable using VGET command(I think so).



Hi Daveporcelan/All,
Quote:
Even if you invoke with TSO first, it will not work as the ISREDIT commands will fail.

I am new to REXX. You are suggesting that ISREDIT is preventing my expectation(for removing command TSO while typing 'TSO B'). Could you please suggest how to overcome this

Because in my previous company, They used some tool, so they can use B for Browse, V for view and so on. But there is no such utility/tool available in my current company to browse/view/edit the file using the command from primary command line.

If I move my current design to production, Since the number of keystokes are larger (Have to type 'TSO B' instead of 'B'), I believe no one will use it(they will opt with ISPF 3.4 option itself).

Please suggest me how to avoid using TSO. Is it possible in REXX or any other language or tool is needed to achieve this?
_________________
Thanks & Regards,
Anand Gunsekaran


CLIST & REXX :: RE: Display ZEDLMSG without Pressing F1 &To avoid usingword TSO

$
0
0
Author: Willy Jensen
Posted: Fri Dec 16, 2016 2:02 pm (GMT 5.5)

The only solution that I know of which will work everywhere, is using the ISPF Command Table as previously suggested.
I have done something similar to what you describe, though my program scans the screen data copy in variable ZSCREENI for the datasetname under the cursor. Note - I recently changed the Screendsn section, so it might not work in all situations.
The program is called @BEVDS and is stored in SYSEXEC:
Code:

/*                                                                      rexx 
 Browse, Edit or View named dataset                                           
*/                                                                           
 arg what ds .                                                               
 if what='' then exit xmsg("Missing 'what'")                                 
 if ds  ='' then ds=ScreenDsn()                                               
 if ds ='' then exit xmsg("Missing dataset")                                 
 ds="'"strip(ds,"b","'")"'"                                                   
 if Sysdsn(ds)<>'OK' then exit xmsg(ds Sysdsn(ds))                           
 if what='M' then Call MEMLIST                                               
 if length(what)=1 then,                                                     
   what=word('BROWSE EDIT VIEW',pos(what,'BEV'))                             
 address ispexec what "dataset("ds")"                                         
 exit 0                                                                       
                                                                             
Memlist:                                                                     
 address ispexec                                                             
 "lminit  dataset("ds") dataid(did)"                                         
 "memlist dataid("did") field(9)"                                             
 "lmfree  dataid("did")"                                                     
 exit 0                                                                       
                                                                             
ScreenDsn:                                                                   
 address ispexec "vget (zscreeni zscreenc zscreenw zscreend)"                 
 zscreeni=zscreeni '"' '"),'                                                 
 p2=min(pos(' ',zscreeni,zscreenc),,                                         
        pos(')',zscreeni,zscreenc),,                                         
        pos(',',zscreeni,zscreenc))                                           
 p1=max(lastpos(' ',left(zscreeni,zscreenc)),,                               
        lastpos('(',left(zscreeni,zscreenc)),,                               
        lastpos('=',left(zscreeni,zscreenc)))+1                               
 ds=substr(zscreeni,p1,p2-p1)                                                 
 if pos('(',ds)>0 then ds=ds')'                                               
 return ds                                                                   
                                                                             
XMsg: if arg(1)<>'' then say arg(1);return word(arg(2) 0,1)


Then I have 3 command table entries:
BDS executes @BEVDS with option B
EDS executes @BEVDS with option E
VDS executes @BEVDS with option V

The command table program I use is found at CBTTAPE.ORG file 349. I like that 'cause I wrote it, but I know that there are others.
The actual statements when using CBT349 are:
Code:

\BDS\0\SELECT CMD(%@bevds B &zparm)\
\EDS\0\SELECT CMD(%@bevds E &zparm)\ 
\VDS\0\SELECT CMD(%@bevds V &zparm)\

_________________
WJ

JCL & VSAM :: RE: JES2 JEC: Use UNIX Pipes to Pass Data Between Concurrent Job

$
0
0
Author: Robert Sample
Subject: Reply to: JES2 JEC: Use UNIX Pipes to Pass Data Between Concurrent Job
Posted: Tue Dec 20, 2016 7:30 pm (GMT 5.5)

The article describes the process pretty clearly. As long as you're using z/OS version 2.2 and the facilities listed in the article, there's no other special requirements.
_________________
TANSTAAFL

The first rule of code reuse is that the code needs to be worth re-using.

"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." -- Donald Knuth

JCL & VSAM :: RE: JES2 JEC: Use UNIX Pipes to Pass Data Between Concurrent Job

$
0
0
Author: Virendra Shambharkar
Subject: Reply to: JES2 JEC: Use UNIX Pipes to Pass Data Between Concurrent Job
Posted: Tue Dec 20, 2016 7:35 pm (GMT 5.5)

Thanks a lot
_________________
Virendra Shambharkar

JCL & VSAM :: RE: DDNAME parameter

$
0
0
Author: Rohit Umarjikar
Posted: Tue Dec 20, 2016 10:05 pm (GMT 5.5)

Yes DDNAME has its own purpose, but in this context you will see no effect because there are NO "DD statements between the forward reference and the concatenation".
Referenced DD statement

Try adding SYSUT1 before SYSUT2 in your Original version (which is not right now) and you will see only DSN01 is copied.
_________________
Regards,
Rohit Umarjikar
"Knowledge is knowing that a tomato is a fruit, but Wisdom is knowing not to put it in a fruit salad."icon_razz.gif

Testing & Performance analysis :: RE: DD DUMMY & CPU TIME

$
0
0
Author: Arun Raj
Posted: Wed Dec 21, 2016 12:20 am (GMT 5.5)

Quote:
you should get ride of the step which produces this data set , if its no longer needed, making DD DUMMY to another step is just a half fix
The OP was talking about DUMMYing the data set in the very step where it is being written. And the suggestion made was to possibly remove the actual file processing in the program besides dummying/removing the output DD, with the remaining program functionality(if any) untouched.
_________________
Arun
----------------------------------------------------------------------------------------------------
Love is like an hourglass, with the heart filling up as the brain empties. -Jules Renard

Viewing all 8500 articles
Browse latest View live