/[drupal]/contributions/modules/stockapi/stockapi.module
ViewVC logotype

Diff of /contributions/modules/stockapi/stockapi.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.9, Tue May 20 16:34:23 2008 UTC revision 1.10, Mon Jul 21 05:25:56 2008 UTC
# Line 2  Line 2 
2  // $Id$  // $Id$
3    
4  /**  /**
5  * @file   * @file
6  * Grab the latest stock info from Yahoo   *  API for retrieving stock information from Yahoo!
7  */   */
8    
9  // 3600 is once an hour  // TODO: Add historical data option.
10  define('STOCKAPI_CRON_UPDATE_FREQUENCY', 3600);  // http://help.yahoo.com/l/us/yahoo/finance/quotes/quote-12.html
11  //Update 30 stock quotes per hour.  
12  define('STOCKAPI_CRON_ROWS_PER_FREQ',    30);  module_load_include('inc', 'stockapi');
   
 /********************************************************************  
 * Drupal Hooks  
 ********************************************************************/  
13    
14  /**  /**
15   * Implementation of hook_menu().   * Implementation of hook_menu().
# Line 28  function stockapi_menu() { Line 24  function stockapi_menu() {
24      'page arguments' => array('stockapi_admin_settings'),      'page arguments' => array('stockapi_admin_settings'),
25      'access arguments' => array('administer site configuration'),      'access arguments' => array('administer site configuration'),
26    );    );
27      $items['stockapi'] = array(
28    return $items;      'title' => 'Stock API',
29  }      'description' => t('Foo'),
30        'page callback' => 'stockapi_page',
31  function stockapi_admin_settings() {      'access arguments' => array('access content'),
   $period = drupal_map_assoc(array(900, 1800, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval');  
   $rows   = drupal_map_assoc(array(30, 100, 500, 1000, 2500, 5000, 10000));  
   
   $form['stockapi_fetch'] = array(  
     '#type' => 'select',  
     '#title' => t('Stock data update frequency'),  
     '#default_value' => variable_get('stockapi_fetch', STOCKAPI_CRON_UPDATE_FREQUENCY),  
     '#options' => $period,  
     '#description' => t('How often to refresh the stock data from Yahoo! Finance. Default is 1 hour (3600 seconds).'),  
   );  
   
   $form['stockapi_rows'] = array(  
     '#type' => 'select',  
     '#title' => t('Symbols to update each cron run cycle'),  
     '#default_value' => variable_get('stockapi_rows', STOCKAPI_CRON_ROWS_PER_FREQ),  
     '#options' => $rows,  
     '#description' => t('How many symbols to update every cron run. This limit is imposed so we do not overload the host.'),  
32    );    );
33    
34    return system_settings_form($form);    return $items;
35  }  }
36    
37  /**  /**
38   * Implementation of hook_cron().   * Implementation of hook_cron().
39   */   */
40  function stockapi_cron() {  function stockapi_cron() {
41    if (time() - variable_get('stockapi_fetch_last', 0) > variable_get('stockapi_fetch', STOCKAPI_CRON_UPDATE_FREQUENCY)) {    if (time() - variable_get('stockapi_fetch_last', 0) > variable_get('stockapi_fetch', 3600)) {
42      $result = db_query_range('SELECT symbol FROM {stockapi} ORDER BY updated', 0, variable_get('stockapi_rows', STOCKAPI_CRON_ROWS_PER_FREQ));      $result = db_query_range('SELECT symbol FROM {stockapi} ORDER BY updated', 0, 199);
43        $symbols = array();
44      while ($data = db_fetch_object($result)) {      while ($data = db_fetch_object($result)) {
45        if ($stock = stockapi_fetch($data->symbol)) {        $symbols[] = $data->symbol;
46          stockapi_save($stock);      }
47        }      $stocks = _stockapi_fetch_quotes($symbols);
48        foreach ($stocks as $key => $stock) {
49          stockapi_save(_stockapi_to_object($stock));
50      }      }
51      variable_set('stockapi_fetch_last', time());      variable_set('stockapi_fetch_last', time());
52      cache_clear_all('variables', 'cache');      cache_clear_all('variables', 'cache');
     watchdog('cron', t('Stock API updated.'));  
53    }    }
54  }  }
55    
56  /**  function stockapi_admin_settings() {
57   * Fetch the stock info for a given ticker symbol from Yahoo!    $period = drupal_map_assoc(array(900, 1800, 3600, 21600, 43200, 86400), 'format_interval');
58   */    $rows   = drupal_map_assoc(array(30, 100, 500, 1000, 2500, 5000, 10000));
 function stockapi_fetch($symbol) {  
   if (empty($symbol)) {  
     return FALSE;  
   }  
   
   $fields = 'snl1c1ohgvd1t1';  
   /*  
     "s"  => "Symbol",  
     "n"  => "Name",  
     "l1" => "Last",  
     "c1" => "Change",  
     "o"  => "Opening",  
     "h"  => "High",  
     "g"  => "Low",  
     "v"  => "Volume",  
     "d1" => "Date",  
     "t1" => "Time"  
    */  
   
   $host = 'http://download.finance.yahoo.com';  
   $url = $host .'/d/quotes.csv?s='. urlencode($symbol) .'&f='.$fields.'&e=.csv';  
   
   $result = drupal_http_request($url);  
   if (isset($result->error)) {  
     watchdog('stockapi', t('StockAPI: drupal_http_request error: @error', array('@error' => $result->error)));  
     return FALSE;  
   }  
   
   if ($result->code != 200) {  
     watchdog('stockapi', t('StockAPI: drupal_http_request code: @code', array('@code' => $result->code)));  
     return FALSE;  
   }  
59    
60    $data = explode(',', str_replace('"', '', $result->data));    $form['stockapi_fetch'] = array(
61    if (!$data) {      '#type' => 'select',
62      watchdog('stockapi', t('StockAPI: no data for symbol(s): @symbol', array('@symbol' => $symbol)));      '#title' => t('Stock data update frequency'),
63      return FALSE;      '#default_value' => variable_get('stockapi_fetch', 3600),
64    }      '#options' => $period,
65        '#description' => t('How often to refresh the stock data from Yahoo! Finance. Default is 1 hour (3600 seconds).'),
66      );
67    
68    $data = array_map('trim', $data);    $quotetype = array('basic' => 'basic', 'extended' => 'extended', 'real-time' => 'realtime');
69    return $data;    $form['stockapi_quotetype'] = array(
70  }      '#type' => 'select',
71        '#title' => t('Select the type of quotes to retrieve'),
72  function stockapi_load($symbol) {      '#default_value' => variable_get('stockapi_quotetype', 'basic'),
73    if (!empty($symbol)) {      '#options' => $quotetype,
74      $stock = db_fetch_array(db_query("SELECT * FROM {stockapi} WHERE symbol = '%s'", $symbol));      '#description' => t('FOO'),
75      if (!$stock) {    );
       $stock = stockapi_fetch($symbol);  
       if ($stock) {  
         if ($stock[8] != 'N/A') {  
           // Date is 'N/A' means an invalid stock symbol  
           stockapi_save($stock);  
   
           // Load again so it can show for the first time  
           $stock = stockapi_load($symbol);  
         }  
       }  
     }  
   }  
76    
77    return $stock;    return system_settings_form($form);
78  }  }
79    
80  function stockapi_save($stock) {  function stockapi_page() {
81    $symbol = $stock[0];    $symbols = array('A','AAPL','AAUK','AAV','ABAX','ABB','ABCO','ABI','ABII','ABMD','ABT','ABV','ABX','ACAP','ACAS','ACC','ACG','ACI','ACL','ACOR','ACUR','ADBE','ADI','ADP','ADPT','ADS','ADSK','ADTN','ADVS','ADX','AEM','AFB','AFFY','AGG','AGN','AGU','AIA','AINV','AIXG','AKAM','AKR','AKRX','ALD','ALGN','ALKS','ALNY','ALOG','ALTR','ALX','ALXN','AMAG','AMAT','AMB','AMCC','AMCN','AME','AMED','AMG','AMGN','AMLN','AMMD','AMRI','AMSC','AMT','AMTD','AMX','ANAD','ANGO','ANH','ANR','ANSS','ANST','AOB','APA','APC','APEI','APF','APH','APOL','APPX','APWR','ARA','ARAY','ARB','ARBA','ARCC','ARD','ARE','AREX','ARMH','ARNA','ARRY','ARST','ARTC','ARTG','ARUN','ASA','ASEI','ASIA','ASR','ATB','ATE','ATF','ATHN','ATHR','ATMI','ATN','ATNI','ATVI','ATW','AU','AUXL','AUY','AVAV','AVB','AVK','AWC','AWF','AXYS','AYE','AZK','AZN','BABY','BANF','BAP','BARE','BAX','BBBB','BBD','BBEP','BBG','BBL','BCA','BCF','BCH','BCPC','BCR','BDE','BDV','BDX','BEAT','BEN','BEXP','BF-B','BFIN','BFK','BFS','BGCP','BGR','BHI','BHK','BHP','BIDU','BIIB','BIV','BK','BKCC','BKE','BKF','BKMU','BKT','BLE','BLK','BLKB','BLUD','BLW','BMC','BMI','BMR','BMRN','BMY','BNA','BNCL','BNI','BNS','BNT','BOE','BOH','BOKF','BPL','BPO','BPT','BRCD','BRCM','BRE','BRKL','BRKR','BRL','BRM','BRO','BRY','BSX','BTE','BTI','BTO','BTU','BUCY','BUD','BUSE','BVN','BWP','BX','BXP','BXS','BYM','BZF','BZP','CA','CACC','CAEI','CAM','CAP','CASS','CAVM','CBSH','CBST','CBU','CCBG','CCI','CCJ','CCL','CCMP','CCOI','CCU','CDE','CDR','CEDC','CEE','CEF','CELG','CEO','CEP','CEPH','CERN','CET','CETV','CF','CFFN','CFR','CFX','CGNX','CHCO','CHFC','CHH','CHI','CHK','CHKP','CHL','CHN','CHNR','CHT','CHTT','CHY','CIB','CIEN','CIG','CISG','CKXE','CL','CLB','CLDA','CLF','CLI','CLNE','CLP','CLR','CLWR','CME','CMED','CMG','CML','CMP','CMTL','CMZ','CNET','CNI','CNQ','CNQR','CNS','CNX','COG','COGT','COH','COMV','COV','CP','CPE','CPHD','CPLA','CPLP','CPRT','CPS','CPST','CPT','CPTS','CPWR','CRA','CREE','CRESY','CRK','CRL','CRM','CRME','CRO','CRR','CRT','CRXL','CRY','CRZO','CSCO','CSGP','CSQ','CSR','CSWC','CSX','CT','CTBI','CTCM','CTCT','CTRP','CTSH','CTXS','CUZ','CVA','CVBF','CVD','CVLT','CVTX','CWEI','CXG','CXO','CXW','CY','CYB','CYBS','CYBX','CYN','CYPB','DAC','DASTY','DBC','DBV','DCOM','DCS','DCT','DDR','DDUP','DECK','DEI','DEL','DEO','DES','DFS','DFT','DGIT','DHR','DHT','DHX','DIA','DIOD','DISCA','DLB','DLR','DM','DMLP','DMRC','DNA','DNB','DNDN','DNEX','DNN','DNP','DNR','DO','DOX','DPTR','DR','DRE','DRIV','DRQ','DRRX','DRYS','DSCP','DSM','DSU','DSX','DTSI','DV','DVN','DVY','DWA','EAC','EAD','EBAY','ECA','ECLP','ECOL','EDR','EDU','EEM','EFA','EFG','EFR','EFT','EFV','EFX','EGLE','EGN','EGO','EGOV','EGP','EGY','EHI','EHTH','EIG','EIM','EJ','ELG','ELN','ELON','ELOS','ELRC','ELS','EMF','ENDP','ENER','ENL','ENOC','ENP','ENSI','ENZ','EOC','EOG','EOI','EOS','EP','EPB','EPIQ','EPP','EPR','EQIX','EQR','EQT','EQY','ERC','ERES','ERF','ERTS','ESD','ESE','ESEA','ESGR','ESI','ESLR','ESS','ESV','ETB','ETG','ETO','ETV','ETW','EURX','EV','EVEP','EVG','EVT','EVTC','EVV','EVVV','EW','EWA','EWC','EWD','EWG','EWH','EWJ','EWL','EWM','EWP','EWQ','EWS','EWT','EWU','EWW','EWY','EWZ','EXAC','EXAR','EXBD','EXC','EXEL','EXLS','EXM','EXPE','EXPO','EXR','EZA','EZCH','EZM','EZU','FARO','FAST','FAX','FCBC','FCE-A','FCEL','FCF','FCL','FCN','FCT','FDG','FDRY','FDS','FEED','FEZ','FFC','FFIN','FFIV','FGF','FIF','FIG','FII','FLIR','FLY','FMBI','FMCN','FMER','FMO','FNB','FNFG','FNX','FOLD','FOR','FORM','FORR','FPO','FR','FRO','FRT','FRX','FSIN','FSLR','FSP','FST','FTEK','FTK','FWRD','FXI','G','GA','GAB','GAF','GAM','GASS','GBCI','GBL','GBN','GCS','GDP','GDV','GDX','GENZ','GERN','GEX','GF','GFA','GFI','GG','GGG','GGN','GGP','GHDX','GHL','GHM','GIGM','GIL','GILD','GIM','GIVN','GLAD','GLD','GLF','GLG','GLNG','GLQ','GLRE','GLS','GLW','GMCR','GMKT','GML','GMR','GMXR','GNK','GNTX','GOLD','GOOG','GPN','GPOR','GPRO','GRC','GRI','GRMN','GRS','GSG','GSH','GSK','GSOL','GSS','GST','GSX','GTE','GTI','GTXI','GTY','GU','GWR','GXDX','GYI','HAE','HAL','HALO','HANS','HBC','HBHC','HCBK','HCN','HCP','HDB','HEP','HERO','HEV','HGSI','HGT','HI','HIL','HIO','HITT','HIW','HIX','HK','HL','HLIT','HLTH','HME','HMIN','HMSY','HMY','HNBC','HNR','HNSN','HOLX','HOMB','HOO','HOS','HP','HPF','HPI','HPS','HQH','HR','HSVLY','HTD','HTH','HTLD','HTS','HTV','HTX','HXM','HYT','HYV','IAG','IART','IAU','IBB','IBKC','IBN','IBOC','ICE','ICF','ICGE','ICLR','ICON','ID','IDC','IDCC','IDIX','IDRA','IDTI','IDU','IDXX','IEF','IEP','IEV','IEX','IEZ','IFN','IGD','IGE','IGM','IGR','IGT','IGV','IHG','IHS','IIF','IIT','IIVI','IJH','IJJ','IJK','IJR','IJS','IJT','ILF','ILMN','IMA','IMAX','IMCL','INCY','INDB','INFA','INFN','INFY','INTC','INTU','INWK','IO','IOO','IPCR','IPGP','IPI','IRC','IRETS','IRIS','ISBC','ISCA','ISIL','ISIS','ISRG','ISYS','ITA','ITC','ITMN','ITU','IVAN','IVE','IVGN','IVV','IVW','IVZ','IWA','IWB','IWD','IWF','IWM','IWN','IWO','IWOV','IWP','IWR','IWS','IWV','IWW','IXC','IXJ','IXN','IXP','IYE','IYF','IYH','IYJ','IYK','IYM','IYR','IYT','IYW','IYY','IYZ','JASO','JCOM','JFR','JKE','JKH','JKHY','JLA','JNJ','JNPR','JNS','JOBS','JOE','JOYG','JPC','JPS','JPZ','JQC','JRJC','JRS','JSN','JTP','KBE','KDN','KF','KFN','KGC','KGS','KIM','KLAC','KNSY','KNX','KNXA','KO','KRC','KRG','KRNY','KSU','KTF','KWK','KYE','KYN','LAMR','LDK','LDR','LEO','LFC','LFL','LFT','LGCY','LGND','LIHR','LLNW','LLTC','LLY','LMDIA','LMNX','LNN','LO','LOGI','LOOP','LQD','LRN','LRY','LTC','LUFK','LUK','LULU','LVS','MA','MAA','MAC','MASI','MATK','MATW','MAV','MBT','MCD','MCF','MCHP','MCHX','MCO','MCR','MCRL','MCRS','MDAS','MDCO','MDR','MDRX','MDT','ME','MEDX','MEE','MELI','MFA','MFE','MFG','MFL','MGRC','MGU','MHN','MICC','MIL','MIN','MINI','MIR','MLM','MLNX','MMSI','MMT','MNT','MNTA','MO','MON','MORN','MOS','MPEL','MPW','MPWR','MQY','MR','MRB','MRH','MRK','MRVL','MRX','MSB','MSCC','MSCS','MSF','MSFT','MSTR','MTB','MTL','MTU','MUC','MUI','MVC','MVF','MVL','MVSN','MWE','MXB','MXF','MXI','MXT','MYD','MYGN','MYI','MYN','N','NAC','NAD','NAL','NAT','NATI','NBG','NBL','NBR','NBTB','NCTY','NCV','NCZ','NDAQ','NDSN','NE','NEM','NEOG','NETC','NETL','NFBK','NFJ','NFX','NG','NGPC','NGS','NHI','NHP','NICE','NIHD','NIO','NL','NLY','NMA','NMO','NMR','NMX','NMZ','NNDS','NNN','NOG','NOV','NOVL','NPBC','NPD','NPI','NPM','NPP','NPT','NPX','NQI','NQM','NQS','NQU','NRP','NRT','NSC','NSH','NSM','NSR','NTAP','NTCT','NTES','NTLS','NTRS','NUAN','NUV','NUVA','NVG','NVO','NVS','NVT','NWSB','NXY','NXZ','NYB','NYX','NZ','NZF','NZH','O','OEF','OEH','OFC','OHI','OII','OMAB','OMCL','OMRI','OMTR','ONB','ONNN','OPK','ORA','ORCL','ORIT','OSIP','OSIR','OTEX','OXPS','OXY','OZM','PAAS','PAC','PAL','PANL','PAR','PAX','PAYX','PBCT','PBF','PBNY','PBR','PBT','PBW','PCK','PCL','PCLN','PCN','PCP','PCS','PCX','PDC','PDE','PDLI','PDS','PDT','PDX','PEGA','PEO','PEP','PETD','PFE','PFN','PFP','PFS','PFWD','PG','PGH','PGJ','PGNX','PHD','PHI','PHK','PHO','PHT','PHX','PICO','PID','PIM','PKE','PKY','PLLL','PMCS','PMF','PMFG','PML','PMM','PMO','PMTC','PMX','PNC','PNFP','PODD','POT','POWI','POZN','PPA','PPDI','PPL','PPO','PPR','PPS','PPT','PQ','PRA','PRAA','PRF','PRFS','PRGS','PRK','PRO','PRSP','PSA','PSB','PSE','PSEC','PSEM','PST','PSY','PTEC','PTEN','PTIE','PTY','PVA','PVG','PVR','PVTB','PWB','PWC','PWE','PWJ','PWRD','PX','PXD','PXJ','PXP','PZN','QCOM','QCOR','QDEL','QELP','QGEN','QID','QLGC','QSFT','QSII','RAME','RATE','RAVN','RBA','RBCAA','RBCN','RBN','RCI','RCS','RDC','RDY','REG','REGN','RES','REXX','RGLD','RHT','RIG','RIGL','RIMM','RIO','RLF','RLRN','RMBS','RMD','RMG','RNOW','RNP','ROLL','ROMA','ROP','ROS','ROSE','ROY','RPF','RPT','RQI','RRC','RSP','RTIX','RTP','RTU','RUK','RVBD','RVT','RWR','RWX','RY','RYAAY','RYN','RZ','SAN','SAP','SAY','SB','SBAC','SBG','SBIB','SBLK','SBNY','SBR','SCBT','SCC','SCD','SCHW','SCMP','SCMR','SCOR','SCR','SD','SDS','SDTH','SDXC','SE','SEIC','SEP','SFI','SFL','SFNC','SFSF','SFY','SGEN','SGLP','SGMO','SGMS','SGP','SGY','SHEN','SHPGY','SHY','SIAL','SID','SIMO','SINA','SIRI','SIRO','SIVB','SJH','SJR','SJT','SJW','SKIL','SKT','SLAB','SLB','SLG','SLH','SLV','SLW','SM','SMBL','SMTC','SNCR','SNDA','SNG','SNH','SNHY','SNI','SNN','SNPS','SNY','SOHU','SOL','SONE','SONO','SONS','SOR','SPG','SPIL','SPN','SPNC','SPSS','SPWR','SQM','SQNM','SRCL','SRDX','SRO','SRVY','SSL','SSS','SSW','SSYS','STAR','STBA','STD','STEC','STEL','STJ','STOSY','STP','STR','STRA','STT','STV','SU','SUBK','SUPX','SUSQ','SVNT','SVR','SWKS','SWN','SWZ','SXCI','SY','SYBT','SYK','SYMC','SYMX','SYNA','SYNT','SYT','SYUT','TAC','TAL','TASR','TBSI','TC','TCK','TCL','TCLP','TCO','TD','TDC','TDF','TDG','TDW','TECH','TEI','TESO','TEVA','TFSL','TGB','TGH','TGP','THFF','THI','THOR','THRX','TIBX','TII','TIP','TIVO','TKC','TKLC','TLEO','TLK','TLL','TLM','TLP','TLT','TMO','TMP','TMRK','TNDM','TNH','TNK','TNP','TOMO','TOWN','TPL','TR','TRAD','TRAK','TRC','TRCA','TRI','TRLG','TRMB','TRMD','TROW','TRP','TRST','TS','TSL','TSM','TSRA','TSS','TTES','TTGT','TV','TWTI','TXCO','TXN','TY','TYG','TYL','TYPE','TZIX','UA','UB','UBA','UBB','UBSI','UDR','UEPS','UHT','ULTI','UMBF','UMC','UNP','UNT','UPL','URBN','USA','USB','USO','UST','UTEK','UTF','UTG','UTHR','UVSP','V','VALU','VAR','VAW','VB','VBK','VBR','VCO','VCP','VDC','VDE','VDSI','VFH','VGK','VGM','VGT','VHT','VICR','VIG','VIP','VISN','VIT','VITL','VIVO','VKI','VKQ','VLCCF','VLCM','VLNC','VLTR','VLY','VMC','VMO','VMW','VNO','VNQ','VNUS','VO','VOCS','VOD','VOLC','VPFG','VPHM','VPL','VPRT','VPU','VPV','VQ','VRSN','VRTX','VRUS','VSEA','VTI','VTR','VTV','VUG','VV','VVR','VVUS','VWO','VXF','WABC','WASH','WAT','WAUW','WAVE','WBMD','WBSN','WCN','WCRX','WDR','WES','WFC','WFR','WFSL','WFT','WGOV','WGW','WHG','WHQ','WIA','WIND','WIT','WIW','WL','WLL','WLT','WMGI','WMS','WPC','WPZ','WRE','WRES','WRI','WSC','WTI','WTR','WU','WWE','WWY','WX','WXS','WYE','WYNN','XCO','XEC','XHB','XLB','XLE','XLF','XLG','XLI','XLK','XLNX','XLP','XLTC','XLU','XLV','XLY','XME','XMSR','XNPT','XRAY','XTO','XXIA','YGE','YHOO','YSI','ZBRA','ZF','ZGEN','ZMH','ZOLT','ZTR');
82    if (!empty($symbol)) {    //$symbols = array('aapl', 'UYG', 'SBUX', 'CROX');
83      stockapi_delete($symbol);  
84      stockapi_insert($stock);    $stocks = stockapi_fetch($symbols);
85      foreach ($stocks as $key => $stock) {
86        stockapi_save(_stockapi_to_object($stock));
87    }    }
88  }    var_dump(stockapi_load('aapl'));
89      var_dump(stockapi_multiload(array('A','AAPL','AAUK','AAV','ABAX','ABB','ABCO','ABI')));
 function stockapi_insert($stock) {  
   return db_query("INSERT INTO {stockapi}  
     VALUES ('%s', '%s', %f, %f, %f, %f, %f, %d, '%s', '%s', %d)",  
     $stock[0],  
     $stock[1],  
     $stock[2],  
     $stock[3],  
     $stock[4],  
     $stock[5],  
     $stock[6],  
     $stock[7],  
     $stock[8],  
     $stock[9],  
     time());  
 }  
   
 function stockapi_delete($symbol) {  
   return db_query("DELETE FROM {stockapi} WHERE symbol = '%s'", $symbol);  
90  }  }

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

  ViewVC Help
Powered by ViewVC 1.1.2