Annotation of embedaddon/php/ext/sqlite/libsqlite/src/copy.c, revision 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>