Annotation of embedaddon/php/ext/sqlite/libsqlite/src/copy.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2003 April 6
                      3: **
                      4: ** The author disclaims copyright to this source code.  In place of
                      5: ** a legal notice, here is a blessing:
                      6: **
                      7: **    May you do good and not evil.
                      8: **    May you find forgiveness for yourself and forgive others.
                      9: **    May you share freely, never taking more than you give.
                     10: **
                     11: *************************************************************************
                     12: ** This file contains code used to implement the COPY command.
                     13: **
                     14: ** $Id: copy.c 195361 2005-09-07 15:11:33Z iliaa $
                     15: */
                     16: #include "sqliteInt.h"
                     17: 
                     18: /*
                     19: ** The COPY command is for compatibility with PostgreSQL and specificially
                     20: ** for the ability to read the output of pg_dump.  The format is as
                     21: ** follows:
                     22: **
                     23: **    COPY table FROM file [USING DELIMITERS string]
                     24: **
                     25: ** "table" is an existing table name.  We will read lines of code from
                     26: ** file to fill this table with data.  File might be "stdin".  The optional
                     27: ** delimiter string identifies the field separators.  The default is a tab.
                     28: */
                     29: void sqliteCopy(
                     30:   Parse *pParse,       /* The parser context */
                     31:   SrcList *pTableName, /* The name of the table into which we will insert */
                     32:   Token *pFilename,    /* The file from which to obtain information */
                     33:   Token *pDelimiter,   /* Use this as the field delimiter */
                     34:   int onError          /* What to do if a constraint fails */
                     35: ){
                     36:   Table *pTab;
                     37:   int i;
                     38:   Vdbe *v;
                     39:   int addr, end;
                     40:   char *zFile = 0;
                     41:   const char *zDb;
                     42:   sqlite *db = pParse->db;
                     43: 
                     44: 
                     45:   if( sqlite_malloc_failed  ) goto copy_cleanup;
                     46:   assert( pTableName->nSrc==1 );
                     47:   pTab = sqliteSrcListLookup(pParse, pTableName);
                     48:   if( pTab==0 || sqliteIsReadOnly(pParse, pTab, 0) ) goto copy_cleanup;
                     49:   zFile = sqliteStrNDup(pFilename->z, pFilename->n);
                     50:   sqliteDequote(zFile);
                     51:   assert( pTab->iDb<db->nDb );
                     52:   zDb = db->aDb[pTab->iDb].zName;
                     53:   if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb)
                     54:       || sqliteAuthCheck(pParse, SQLITE_COPY, pTab->zName, zFile, zDb) ){
                     55:     goto copy_cleanup;
                     56:   }
                     57:   v = sqliteGetVdbe(pParse);
                     58:   if( v ){
                     59:     sqliteBeginWriteOperation(pParse, 1, pTab->iDb);
                     60:     addr = sqliteVdbeOp3(v, OP_FileOpen, 0, 0, pFilename->z, pFilename->n);
                     61:     sqliteVdbeDequoteP3(v, addr);
                     62:     sqliteOpenTableAndIndices(pParse, pTab, 0);
                     63:     if( db->flags & SQLITE_CountRows ){
                     64:       sqliteVdbeAddOp(v, OP_Integer, 0, 0);  /* Initialize the row count */
                     65:     }
                     66:     end = sqliteVdbeMakeLabel(v);
                     67:     addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end);
                     68:     if( pDelimiter ){
                     69:       sqliteVdbeChangeP3(v, addr, pDelimiter->z, pDelimiter->n);
                     70:       sqliteVdbeDequoteP3(v, addr);
                     71:     }else{
                     72:       sqliteVdbeChangeP3(v, addr, "\t", 1);
                     73:     }
                     74:     if( pTab->iPKey>=0 ){
                     75:       sqliteVdbeAddOp(v, OP_FileColumn, pTab->iPKey, 0);
                     76:       sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0);
                     77:     }else{
                     78:       sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
                     79:     }
                     80:     for(i=0; i<pTab->nCol; i++){
                     81:       if( i==pTab->iPKey ){
                     82:         /* The integer primary key column is filled with NULL since its
                     83:         ** value is always pulled from the record number */
                     84:         sqliteVdbeAddOp(v, OP_String, 0, 0);
                     85:       }else{
                     86:         sqliteVdbeAddOp(v, OP_FileColumn, i, 0);
                     87:       }
                     88:     }
                     89:     sqliteGenerateConstraintChecks(pParse, pTab, 0, 0, pTab->iPKey>=0, 
                     90:                                    0, onError, addr);
                     91:     sqliteCompleteInsertion(pParse, pTab, 0, 0, 0, 0, -1);
                     92:     if( (db->flags & SQLITE_CountRows)!=0 ){
                     93:       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);  /* Increment row count */
                     94:     }
                     95:     sqliteVdbeAddOp(v, OP_Goto, 0, addr);
                     96:     sqliteVdbeResolveLabel(v, end);
                     97:     sqliteVdbeAddOp(v, OP_Noop, 0, 0);
                     98:     sqliteEndWriteOperation(pParse);
                     99:     if( db->flags & SQLITE_CountRows ){
                    100:       sqliteVdbeAddOp(v, OP_ColumnName, 0, 1);
                    101:       sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC);
                    102:       sqliteVdbeAddOp(v, OP_Callback, 1, 0);
                    103:     }
                    104:   }
                    105:   
                    106: copy_cleanup:
                    107:   sqliteSrcListDelete(pTableName);
                    108:   sqliteFree(zFile);
                    109:   return;
                    110: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>